2013-04-23 5 views
11

ブラウザで前後のボタンを使用しているときにGoogle Chromeは「cache-control:must-revalidate」を送信してもローカルにキャッシュされたページを使用します。Google Chromeは前後にエタグを再検証しません

これは、元の応答の一部です:

:私はページを更新する場合は

HTTP/1.1 200 OK 
cache-control: private, must-revalidate 
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e" 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

が、私は「HTTP/1.1 304未修飾」応答を得るが、私は次の応答を得る戻るボタンを使用する場合

Request URL:example.com 
Request Method:GET 
Status Code:200 OK (from cache) 

私が探している応答は304または200です。これは可能ですか?

答えて

13

戻る]ボタンや[進む]ボタンを使用する場合は、ページのキャッシュされたコピーを返すブラウザを防止するためのキーCache-Controlディレクティブはno-storeです。

他に何も役立たず、他に必要なものはありません。あなたのCache-Controlヘッダは、単純にすることができます:

Cache-Control: no-store 

このかかわらには2つの例外があります。

  1. OperaとSafariは、設定したヘッダー(少なくとも私がテストしたバージョン)にかかわらず、再検証は行いません。新しいタブでページを開くとそのコピーは新鮮ですが、元のタブは、URLを更新または再入力するまで前後にナビゲートすると古いバージョンを表示し続けます。
  2. Firefoxには、開いている最初のページ(バックボタンがない場合)のキャッシュにバグがあるようです。後続のすべてのインスタンスは、前後にナビゲートすると更新されますが、一番上のページにすべてバックアップすると、初期の古いコピーが表示されることがあります。

最後に、このディレクティブの使用は、帯域幅の使用に大きな影響を与えるため、一般的にはお勧めできません。ブラウザは、Etagsを利用して304 Not Modified応答を得ることもできません。これは、応答が受信されたときに使用する保存されたコピーがないためです。

+1

基本的に前後のボタンを動作させたい場合は、etagsを利用できませんか? – Dennis

+1

はい。それが私がやったすべてのテストで見つけたものです。 –

+0

http://madhatted.com/2013/6/16/you-do-not-understand-browser-historyには、状況の興味深い議論が含まれています。 – Gili

3

"must-revalidate"指示は、応答が古くなった後にのみ適用されます(RFC2616, sec 14.9.4)。レスポンスには "Expires"ヘッダと "max-age"ディレクティブが含まれていないため、ブラウザはレスポンスを新鮮なものとして扱い、キャッシュされたコピーを返す可能性があります。これを避けるには、キャッシュされた応答が直ちに失効するように、Cache-Controlヘッダーに「max-age:0」を含めます(おそらく過去の日付を含むExpiresヘッダー)。代わりに、キャッシュを防止するために、 "must-revalidate"ではなく "no-cache"ディレクティブを使用してください。

+1

RFC2616の13.2.4より:「最大有効期限がExpiresより優先されます。あなたは両方を必要としません。そして、いずれにしても、戻るボタンでナビゲートするとブラウザが古いコピーを表示するのを防ぐことはできません。 –

+0

私はJamesのコメントを確認しましたが、解決策は戻るボタンでは機能しません。 – Dennis

2

cacheディレクティブを使用して、ブラウザにページをディスクキャッシュに書き込まないように指示することができます。 no-cacheと組み合わせると、すべてのブラウザがディスクからではなく上流からリソースをフェッチするようになります。

Cache-Control: private, no-cache, no-store

+0

私はブラウザが前後にナビゲートするときにエタグを再検証することを望みます。 – Dennis

+2

これは、ブラウザが再検証してはならないことを指定するRFC2616セクション13.13(http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html)に違反します: "履歴メカニズムとキャッシュは異なります。特に履歴メカニズムは試してはいけません。リソースの現在の状態を意味的に透過的に表示するのではなく、リソースが取得された時点でユーザーが見たものを正確に表示することを目的としています。戻るボタンでアクセスされた有効期限の切れたページを再検証したりフェッチしたりしないブラウザは、実際には正しいことをしています。 – SpliFF

+1

ブラウザには選択肢がないため、 'no-store'だけが動作します。表示するローカルコピーがないので、アップストリームをフェッチする必要があります。 – SpliFF

関連する問題