HTTP 301 永続リダイレクトに関する問題をデバッグしています。簡単なテストを行ったところ、Safari は再起動時に 301 のキャッシュをクリアしますが、Firefox はクリアしないようです。
IE、Chrome、Firefox、Safari はいつ 301 のキャッシュをクリアしますか?
たとえば、1.example
にリダイレクトしたいのに2.example
、誤って にリダイレクトするように設定してしまった場合3.example
、問題が生じます。間違いは修正できますが、1.example
その間にアクセスしたユーザーは への誤ったリダイレクトをキャッシュしてしまうため、キャッシュがクリアされるまで にも3.example
にもアクセスできなくなります。調査の結果、およびヘッダーが設定されていなかったことがわかりました。誤った 301 応答のヘッダーは次のようになります。1.example
2.example
Cache-Control
Expires
HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://3.example/
Content-Type: text/html
私の独自のテストでは次のことがわかりました:
- IE7、IE8、Android 2.3.4 はまったくキャッシュしません。
- Firefox 18.0.2、Safari 5.1.7 (Windows 7 上)、Opera 12.14 はすべてキャッシュし、ブラウザを再起動するとキャッシュがクリアされます。
- IE10 と Chrome 25 のキャッシュですが、ブラウザを再起動してもクリアされません。いつクリアされるのでしょうか?
ベストアンサー1
別途指定するキャッシュ制御ディレクティブがない場合、301 リダイレクトはデフォルトで有効期限なしでキャッシュされます。
つまり、ブラウザのキャッシュが対応できる限り、キャッシュされたままになります。手動でキャッシュをクリアするか、新しいエントリのためのスペースを確保するためにキャッシュ エントリが消去されると、キャッシュから削除されます。
少なくとも Firefox では、about:cache
ディスク キャッシュに移動してそれを見つけることでこれを確認できます。Chrome や Chromium ベースの Edge などの他のブラウザーでも同じように機能しますが、キャッシュを検査するための はありませんabout:cache
。
すべてのブラウザでは、以下で説明するように、キャッシュ ディレクティブを使用してこのデフォルトの動作を上書きすることができます。
リダイレクトをキャッシュしたくない場合は
この無期限のキャッシュは、他の指定をするヘッダーがない場合に、これらのブラウザによるデフォルトのキャッシュです。ロジックとしては、「永続的な」リダイレクトを指定し、他のキャッシュ指示を与えていないため、ブラウザはそれを無期限にキャッシュしたいかのように扱います。
Cache-Control ヘッダーと Expires ヘッダーが指定されている場合、ブラウザは他の応答と同様にそれらを尊重します。
301 リダイレクトにCache-Control: max-age=3600
またはなどのヘッダーを追加できます。 を追加して、ブラウザーによって永続的にキャッシュされないようにしたり、ブラウザーによって一時ストレージに保存されないようにしたりすることもできます。Expires: Thu, 01 Dec 2014 16:00:00 GMT
Cache-Control: no-cache
Cache-Control: no-store
ただし、リダイレクトを永続的にしたくない場合は、302 または 307 リダイレクトを使用する方がよい場合があります。301 リダイレクトを発行してキャッシュ不可としてマークすることは、技術的には有効であっても、301 リダイレクトの目的に反します。結果は人によって異なり、"永続的な" リダイレクトに時間制限を設けることが理にかなっている特殊なケースが見つかるかもしれません。302 および 307 リダイレクトは、デフォルトではブラウザーによってキャッシュされないことに注意してください。
以前に301リダイレクトを発行したが、それを元に戻したい場合
ユーザーのブラウザに 301 リダイレクトがキャッシュされている場合、ソース ページにリダイレクトが残っているかどうかに関係なく、引き続きターゲット ページに移動します。これを修正するには、次のオプションがあります。
簡単な解決策は、もう一度リダイレクトを発行することです。
リダイレクト中にブラウザが同じ URL に再度戻される場合、リダイレクト ループを回避するために、キャッシュから再度リダイレクトするのではなく、オリジンから再度取得する必要があります。この回答のコメントによると、これは現在すべての主要ブラウザで機能しますが、機能しないマイナーなブラウザもある可能性があります。
以前のリダイレクト先のサイトを制御できない場合は、運が悪いことになります。サイトの所有者に、リダイレクトを戻すように頼んでみてください。
予防は治療よりも優れています。古い URL を永久に廃止するかどうかわからない場合は、301 リダイレクトを避けてください。