HTTP 301 Permanent Redirectの問題をデバッグしています。簡単なテストの結果、Safariは再起動時に301秒のキャッシュをクリアするようですが、Firefoxはそうではありません。
IE、Chrome、Firefox、Safariが301秒のキャッシュをクリアするのはいつですか。
UPDATE:たとえば、example1.com
をexample2.com
にリダイレクトしたいが、誤ってexample3.com
にリダイレクトするように設定した場合、それが問題になります。私は間違いを訂正することができますが、その間にexample1.com
を訪れた人は誰でもexample3.com
への誤ったリダイレクトをキャッシュしているので、キャッシュがクリアされるまでexample1.com
またはexample2.com
に到達することはできません。調査の結果、Cache-Control
およびExpires
ヘッダーが設定されていないことがわかりました。不正確な301応答のヘッダーは次のようになります。
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://example3.com/
Content-Type: text/html
私自身のテストはそれを示しています:
少なくとも2つのブラウザ - ChromeとFirefox - は有効期限なし301リダイレクトをキャッシュします。
つまり、ブラウザのキャッシュに収まる限りキャッシュされたままになります。手動でキャッシュをクリアした場合、またはキャッシュエントリが新しいエントリ用のスペースを空けるためにパージされた場合は、キャッシュから削除されます。
少なくともFirefoxでは、about:cache
に移動してディスクキャッシュの下に置くことでこれを確認できます。
私はIE10/IE11のような他のブラウザの動作について知りません。しかし、他のブラウザは無期限にキャッシュするので、とにかくこれに対応する必要があります。
Chrome/Firefoxを含むすべてのブラウザで、以下で説明するように、ヘッダを使用してこのデフォルトの動作をオーバーライドすることは依然として可能です。
注:この回答は2014年に書かれたものであり、ブラウザの動作は時間の経過とともに変わる可能性があります。
リダイレクトをキャッシュしたくない場合
この無期限のキャッシュは、Cache-Controlヘッダーがない場合のこれらのブラウザによるデフォルトのキャッシュのみです。論理的には、あなたが "恒久的な"リダイレクトを指定し、それらに他のキャッシュ命令を与えていないので、彼らはあなたがそれを無期限にキャッシュしたかったように扱うでしょう。
指定されている場合、ブラウザは他の応答と同様に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のリダイレクトを使うことです。これらは、ブラウザやキャッシュが「恒久的な」リダイレクトであることを暗示するものではないため、Cache-Controlヘッダーがなくてもキャッシュするべきではありません。
私にとっては、301リダイレクトを発行するが、それをキャッシュ不可としてマークすることは、301リダイレクトの目的の精神に反しているように思われます。それは技術的に有効かもしれません。 YMMV、そしてあなたはそれが制限時間を持つことが「永久的な」リダイレクトのために理にかなっているEdgeケースを見つけるかもしれません。
以前に301リダイレクトを発行したが、それを未実行にしたい場合
ブラウザのキャッシュ301リダイレクトがまだある場合は、ソースページにまだリダイレクトがあるかどうかにかかわらず、引き続きターゲットページに移動します。これを修正するためのあなたのオプションは次のとおりです。
最も簡単で最善の解決策は、再度301リダイレクトを発行することです。
ブラウザは、以前に無効化されたURLであると考えていたものに戻ってきていることに気付くでしょう。これにより、そのURLを再度取得して、古いリダイレクトがまだないことを確認します。
編集:いくつかのコメントはこれに疑問を投げかけています、下記参照。
以前のリダイレクトターゲットが移動したサイトを制御できない場合は、運が悪くなります。あなたにリダイレクトするようにサイトの所有者に依頼してみてください。
予防は治療よりも優れています - 古いURLを永久に無効にしたいのかわからない場合は301リダイレクトを避けてください。
恒久的なリダイレクトを解除するには、chrome:// net-internalsに行きます。一番上の赤いステータスバーの右側にある下向きの矢印▼をクリックしてドロップダウンメニューを開き、[ツール]グループの下で[キャッシュをクリア]を選択します。
バージョン48の時点で、これがキャッシュされた301をクリアするために私にとって有効な唯一のものでした。
更新:残念ながら、バージョン71(2018年12月)現在、Googleはネット内部機能を削除しています。
必死にリダイレクトキャッシュを取り除きたい人を手助けする答え:
Chromeは301リダイレクトを無限に(ローカルディスクキャッシュに)キャッシュします。このキャッシュをクリアするには
F12
を押します)F5
を押す)すべて問題なければ、「キャッシュを無効にする」のチェックを外しても期待通りに動作します。
ユーザーにそのURLに投稿フォームを送信させると、キャッシュされたリダイレクトがなくなります。
<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
<input type="submit" value="fix" />
</form>
</body>
301
はHTTP RFCごとにキャッシュ可能なレスポンスであり、ブラウザはレスポンスにあるHTTPキャッシングヘッダに応じてそれをキャッシュします。 FireBugまたはCharlesを使用してレスポンスヘッダーを調べ、レスポンスがキャッシュされる正確な期間を知ります。
キャッシュ期間を制御したい場合は、HTTP応答ヘッダーのCache-Control
とExpires
を使用して同じことを実行できます。あるいは、301
レスポンスをまったくキャッシュしたくない場合は、以下のヘッダを使用してください。
Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
確認しました!ユーザーに影響を受けるURLに投稿要求を送信させると、キャッシュされたリダイレクトは忘れられます。
簡単な勝利あなたができるならブラウザのコンソールでこれを入力することでしょう:
fetch('example.com/affected/link', {method: 'post'}).then(() => {})
影響を受けるブラウザを知っていれば便利です(特に開発中)。
代わりに、あなたが前の301リダイレクトページにアクセスするなら、あなたはそのページにこのスクリプトを追加することができ、それが訪問される時はいつでもキャッシュされた301は忘れられます。
テスト目的で(リダイレクトされたリダイレクトを避けるため)、NEW PRIVATE WINDOW:click CTRL+SHIFT+
N
[Mozillaを使用している場合はP
]を開くことができます。
私はすべての主要なブラウザ(最新バージョン)で動く簡単な解決策を持っています、IE、ChromeとFFを含みます
@thomasrutterの回答として
以前に301リダイレクトを発行したが、それを未実行にしたい場合
ブラウザのキャッシュ301リダイレクトがまだある場合は、ソースページにまだリダイレクトがあるかどうかにかかわらず、引き続きターゲットページに移動します。これを修正するためのあなたのオプションは次のとおりです。
最も簡単で最善の解決策は、再度301リダイレクトを発行することです。
ブラウザは、それが以前に廃止されたURLであると考えていたものに戻されていることに気付くでしょう。
以前のリダイレクトターゲットが移動したサイトを制御できない場合は、運が悪くなります。あなたにリダイレクトするようにサイトの所有者に依頼してみてください。
実際、これは次のことを意味します。
a.com 301からb.comへ
a.comの301を削除
a.comにb.com 301を追加
それでうまくいきます。
Localhostアドレスの問題を解決するために、サイトが動作するポート番号を変更しました。これはChromeバージョン73.0.3683.86で動作しました。
他の答えが示すように。キャッシングはブラウザ内で無期限に行われることがあります。これは非常に危険です。そうしないでください。少なくともキャッシュヘッダーを追加してください。 htaccessでは、私はいつもこのようにして、今はまったくキャッシュしています。
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_Host} ^(www\.)?example\.com$ [NC]
# The E=nocache:1 sets the environment variable nocache to the value of one
RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>
<IfModule mod_headers.c>
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>
Incognito/InPrivateモードを使用してリダイレクトをテストすると、ブラウザを閉じたときにそのキャッシュがフラッシュされ、ウィンドウを再度開いてもキャッシュが含まれなくなります。