web-dev-qa-db-ja.com

ブラウザはどのくらいの期間HTTP 301をクラッシュしますか?

HTTP 301 Permanent Redirectの問題をデバッグしています。簡単なテストの結果、Safariは再起動時に301秒のキャッシュをクリアするようですが、Firefoxはそうではありません。

IE、Chrome、Firefox、Safariが301秒のキャッシュをクリアするのはいつですか。

UPDATE:たとえば、example1.comexample2.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

私自身のテストはそれを示しています:

  • IE7、IE8、Android 2.3.4はまったくキャッシュしません。
  • Firefox 18.0.2、Safari 5.1.7(Windows 7)、およびOpera 12.14はすべてキャッシュし、ブラウザの再起動時にキャッシュをクリアします。
  • IE10とChrome 25はキャッシュしますが、ブラウザの再起動時にクリアしませんだからいつクリアされるのでしょうか?
316
Liam

少なくとも2つのブラウザ - ChromeとFirefox - は有効期限なし301リダイレクトをキャッシュします

つまり、ブラウザのキャッシュに収まる限りキャッシュされたままになります。手動でキャッシュをクリアした場合、またはキャッシュエントリが新しいエントリ用のスペースを空けるためにパージされた場合は、キャッシュから削除されます。

少なくともFirefoxでは、about:cacheに移動してディスクキャッシュの下に置くことでこれを確認できます。

私はIE10/IE11のような他のブラウザの動作について知りません。しかし、他のブラウザは無期限にキャッシュするので、とにかくこれに対応する必要があります。

Chrome/Firefoxを含むすべてのブラウザで、以下で説明するように、ヘッダを使用してこのデフォルトの動作をオーバーライドすることは依然として可能です。

注:この回答は2014年に書かれたものであり、ブラウザの動作は時間の経過とともに変わる可能性があります。

リダイレクトをキャッシュしたくない場合

この無期限のキャッシュは、Cache-Controlヘッダーがない場合のこれらのブラウザによるデフォルトのキャッシュのみです。論理的には、あなたが "恒久的な"リダイレクトを指定し、それらに他のキャッシュ命令を与えていないので、彼らはあなたがそれを無期限にキャッシュしたかったように扱うでしょう。

指定されている場合、ブラウザは他の応答と同様にCache-ControlヘッダーとExpiresヘッダーを引き続き使用します。

301リダイレクトにCache-Control: max-age=3600Expires: 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リダイレクトを避けてください。

270
thomasrutter

恒久的なリダイレクトを解除するには、chrome:// net-internalsに行きます。一番上の赤いステータスバーの右側にある下向きの矢印▼をクリックしてドロップダウンメニューを開き、[ツール]グループの下で[キャッシュをクリア]を選択します。

バージョン48の時点で、これがキャッシュされた301をクリアするために私にとって有効な唯一のものでした。

更新:残念ながら、バージョン71(2018年12月)現在、Googleはネット内部機能を削除しています。

229
McGuireV10

必死にリダイレクトキャッシュを取り除きたい人を手助けする答え:

Chromeは301リダイレクトを無限に(ローカルディスクキャッシュに)キャッシュします。このキャッシュをクリアするには

  • DevToolsを開きます(F12を押します)
  • ネットワークタブで"キャッシュを無効にする"チェックボックスをチェックしてください。
  • devToolsを開いたままにして、リロードページ(F5を押す)

すべて問題なければ、「キャッシュを無効にする」のチェックを外しても期待通りに動作します。

94
Olaf

ユーザーにそのURLに投稿フォームを送信させると、キャッシュされたリダイレクトがなくなります。

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
28
Krtek Net

301はHTTP RFCごとにキャッシュ可能なレスポンスであり、ブラウザはレスポンスにあるHTTPキャッシングヘッダに応じてそれをキャッシュします。 FireBugまたはCharlesを使用してレスポンスヘッダーを調べ、レスポンスがキャッシュされる正確な期間を知ります。

キャッシュ期間を制御したい場合は、HTTP応答ヘッダーのCache-ControlExpiresを使用して同じことを実行できます。あるいは、301レスポンスをまったくキャッシュしたくない場合は、以下のヘッダを使用してください。

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
22
Alex J

確認しました!ユーザーに影響を受けるURLに投稿要求を送信させると、キャッシュされたリダイレクトは忘れられます。

簡単な勝利あなたができるならブラウザのコンソールでこれを入力することでしょう:

fetch('example.com/affected/link', {method: 'post'}).then(() => {})

影響を受けるブラウザを知っていれば便利です(特に開発中)。

代わりに、あなたが前の301リダイレクトページにアクセスするなら、あなたはそのページにこのスクリプトを追加することができ、それが訪問される時はいつでもキャッシュされた301は忘れられます。

8
Ajeh Emeke Jnr

Httpリダイレクト用のブラウザキャッシュを削除する非常に簡単な方法があります。 301、307など.

開発者コンソールのネットワークパネルをクロムで開くことができます。ネットワーク通話を選択します。それを右クリックしてからブラウザキャッシュをクリアをクリックしてキャッシュされたリダイレクトを削除します。

network call context menu

8
Rajesh Paul

テスト目的で(リダイレクトされたリダイレクトを避けるため)、NEW PRIVATE WINDOW:click CTRL+SHIFT+N [Mozillaを使用している場合はP]を開くことができます。

7
T.Todua

私はすべての主要なブラウザ(最新バージョン)で動く簡単な解決策を持っています、IE、ChromeとFFを含みます

  1. Ctrl + Shift + Del
  2. -
    1. Chrome:[閲覧履歴]と[キャッシュ]を選択します。
    2. IE:デフォルトのオプション "インターネット一時ファイルとウェブサイトのファイル"、 "クッキーとウェブサイトのデータ"、 "履歴"のままにします
    3. FF: "閲覧とダウンロードの履歴"、 "キャッシュ"
  3. 「削除」をクリック
  4. ブラウザを閉じて再度開きます。うまくいくはずです
6
Dung Le

@thomasrutterの回答として

以前に301リダイレクトを発行したが、それを未実行にしたい場合

ブラウザのキャッシュ301リダイレクトがまだある場合は、ソースページにまだリダイレクトがあるかどうかにかかわらず、引き続きターゲットページに移動します。これを修正するためのあなたのオプションは次のとおりです。

最も簡単で最善の解決策は、再度301リダイレクトを発行することです。

ブラウザは、それが以前に廃止されたU​​RLであると考えていたものに戻されていることに気付くでしょう。

以前のリダイレクトターゲットが移動したサイトを制御できない場合は、運が悪くなります。あなたにリダイレクトするようにサイトの所有者に依頼してみてください。

実際、これは次のことを意味します。

  1. a.com 301からb.comへ

  2. a.comの301を削除

  3. a.comにb.com 301を追加

それでうまくいきます。

5
phil han

Localhostアドレスの問題を解決するために、サイトが動作するポート番号を変更しました。これはChromeバージョン73.0.3683.86で動作しました。

1
combatc2

他の答えが示すように。キャッシングはブラウザ内で無期限に行われることがあります。これは非常に危険です。そうしないでください。少なくともキャッシュヘッダーを追加してください。 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>
1
yunzen

Incognito/InPrivateモードを使用してリダイレクトをテストすると、ブラウザを閉じたときにそのキャッシュがフラッシュされ、ウィンドウを再度開いてもキャッシュが含まれなくなります。

1
yougotiger