web-dev-qa-db-ja.com

Apache RewriteRuleがリダイレクトしない

私は.htaccessファイルにこれを持っています:

RewriteEngine on

RewriteRule ^images/chart\.png$    /static/images/chart.png    [L,R=301]
RewriteRule ^images/artwork/(.+).png   /static/artwork/$1.jpg  [L,R=301]

# codeigniter
RewriteCond $1 !^(index\.php|static|images|admin|user_guide|sitemap\.xml\.gz|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

CodeIgniterパーツは、imagesおよびstaticフォルダーを無視する必要があります。ただし、example.com/images/chart.pngを開くと、CI 404ページが表示されます。他の301リダイレクトは正常に機能しています。

これを推測することはできません、誰も考えていますか?

3
DisgruntledGoat

私は、CI RewriteCond句からimagesディレクトリを削除することで、最終的に自分でこれを修正することができました。 (images/chart.pngのリクエストがCI部分に到達するべきではないため、なぜそれが機能したのかを100%確信できません。)

0
DisgruntledGoat

ここで何が起こっているのかは、書き換えが実際に機能しているが、R = 301が2回目の反復を引き起こし、404が発生していることです。

リクエストはimages/chart.pngで受信され、書き換えルールが機能します。最初のルールで一致すると、301リダイレクトが発生します。この301リダイレクトは、/static/images/chart.pngに対して新しいリクエストを発行するようブラウザに指示します。

そのため、新しい要求はサーバーに送られ、書き換えルールが再度実行されます。今回は、リクエストは上部のカスタムルールと一致せず、CodeIgniterルールになります。新しいURLは「静的」で始まるため、CIルールと一致し、/index.php?/static/images/chart.pngにリダイレクトされます。 CIにはこれを処理するための手掛かりがないため(私は推測します)、リソースを見つけられないことをユーザーに通知するために404を捨てます。

行うことは、CIルールを更新して次の条件を追加することです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

これにより、mod_rewriteは、要求が文字通り既存のファイル(!-f)またはディレクトリ(!-d)に対するものでない場合にのみルールを実行するように指示します。

この更新が行われると、最初のルールにより/static/images/chart.pngに対して同じリダイレクトが行われますが、そのファイルはそのパスに文字通り存在するため、CIルールはそのままにして、新しい書き換えは行われません。サーバーは、通常どおりイメージを提供します。

0
AgentConundrum