0

私はmod_rewriteを使用して、指定されたファイル名で使用できるものに応じて(外部リダイレクトなしで)またはファイルを.img提供しようとしています。pngjpg

これが私が試していることです:

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=3]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond %{REQUEST_FILENAME}.png -f
RewriteRule ^ $0.png [S=1,T=image/png]

RewriteCond %{REQUEST_FILENAME}.jpg -f
RewriteRule ^ $0.jpg [T=image/jpeg]

最初のビットは正常に機能しているように見えますが(ファイルを拡張子なしにリダイレクト.imgします)、後のチェックは実行されません。.imgmod_rewriteが実際にどのように機能するかはかなりわかりませんが、これはリクエストが名前変更で再開され、拡張子がなくなったため、最初のルールが開始され、他のルールが実行されなくなるためだと思います。しかし、これを回避する方法がわかりません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

私はそれを考え出した。私の元のコードはかなり近いものでした。修正バージョンは次のとおりです。

更新:これは404エラーを正しく表示するバージョンです(以下のバージョンはmysite.com/mydirectory.imgをディレクトリにリダイレクトしますが、これは奇妙な動作です)

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=4]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond /var/www/html%{REQUEST_FILENAME}.png -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.png [L,S=2,T=image/png]

RewriteCond /var/www/html%{REQUEST_FILENAME}.jpg -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.jpg [L,S=1,T=image/jpeg]

RewriteRule ^ - [R=404]

元の解決策(404チェックなし):

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=3]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond /var/www/html%{REQUEST_FILENAME}.png -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.png [S=1,T=image/png]

RewriteCond /var/www/html%{REQUEST_FILENAME}.jpg -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.jpg [T=image/jpeg]

注意すべき点は次のとおりです。

  • ファイルチェックにルートフォルダを追加しました。${REQUEST_FILENAME} 開始は単純にに設定されているようで%{REQUEST_URI}、最初の書き換えは変更されませんが%{REQUEST_URI}変更されますが、URI形式のままになります。${REQUEST_FILENAME}
  • に変更$0しました%{REQUEST_FILENAME}。何$0が設定されているかはわかりませんが(正規表現を含む空の文字列である可能性があります^)、変更するまで403Forbiddenエラーが発生していました。

それが他の誰かを助ける場合に備えて、私は次の行でそれをデバッグしました:

RewriteRule ^ /debug?u=%{REQUEST_URI}&f=%{REQUEST_FILENAME} [R]

これは、変数をクエリ文字列の形式でブラウザに送信します。

だからそれは動作します。これらのことをたくさん書き、ほとんどのドキュメントを読んだにもかかわらず、mod_rewriteがどのルールをいつどの入力で実行するかをどのように決定するのかまだわかりません…</ p>

于 2013-03-26T16:38:31.667 に答える
0

代わりにこれを試すことができます:

RewriteCond %{REQUEST_FILENAME} /(.*)\.img$
RewriteCond /%1.png -f
RewriteRule ^ /%1.png

RewriteCond %{REQUEST_FILENAME} /(.*)\.img$
RewriteCond /%1.jpg -f
RewriteRule ^ /%1.jpg

これが機能する場合は、リクエストごとに1回の書き換えのみが必要になります。

于 2013-03-26T21:36:23.040 に答える