私は.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リダイレクトは正常に機能しています。
これを推測することはできません、誰も考えていますか?
私は、CI RewriteCond
句からimagesディレクトリを削除することで、最終的に自分でこれを修正することができました。 (images/chart.png
のリクエストがCI部分に到達するべきではないため、なぜそれが機能したのかを100%確信できません。)
ここで何が起こっているのかは、書き換えが実際に機能しているが、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ルールはそのままにして、新しい書き換えは行われません。サーバーは、通常どおりイメージを提供します。