.htaccessなどで301リダイレクトを設定するとchromeで結果をキャッシュしてしまう開発者泣かせの仕様

chromeを少しでも高速化するための仕様なのでしょうけど開発者には辛い仕様です・・・。

今回、.htaccessで以下のようにURL末尾にスラッシュ無しでアクセスされた場合、スラッシュを補完したURLに301リダイレクトするように設定しました。

RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]

この設定をした後に気がついたことがあり、一旦この設定を破棄したのですが、.htaccessの内容を変更しようが、.htaccess自体を削除しようが一度適用した設定が適用されたままになってしまったのです。

結論としては、これは記事タイトルのとおりchromeが301リダイレクトをキャッシュしてしまう仕様が原因でした。

なのでブラウザのキャッシュをクリアしてしまえば解決するのですが、Ctrl + F5ではこの301リダイレクトのキャッシュは削除されないので、ツール→閲覧履歴の消去→閲覧履歴データの消去、の手順でキャッシュを削除すると復活します。

chromeの開発者ツールを起動して歯車マークをクリックし「Disable cache (while DevTools is open)」にチェックを入れると301リダイレクトの結果もキャッシュされなくなったので、開発中はこの設定にしておくのが良さそうです。(※要デベロッパーツール起動)

ちなみに.htaccessで設定する場合だけでなくPHPなどでリダイレクトをかける際に使用する、

header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: http://sample.com" );

みたいなコードでも301リダイレクトであれば同現象に陥ってしまうそうですので要注意です。