さまざまなタイプのリソースに最適なHTTPキャッシュ制御ヘッダー


82

「すべての」キャッシュとブラウザで機能する最小限のヘッダーセットを見つけたい(HTTPSを使用している場合も!)

私のWebサイトには、次の3種類のリソースがあります。

(1)永久にキャッシュ可能(パブリック/すべてのユーザーに等しい)

例:0A470E87CC58EE133616F402B5DDFE1C.cache.html(GWTによって自動生成

  • これらのファイルは、コンテンツが変更されると(MD5に基づいて)、自動的に新しい名前が割り当てられます。

  • HTTPSを使用している場合でも、可能な限りキャッシュする必要があります(したがってCache-Control: public、特にFirefoxの場合は設定する必要がありますか?)

  • コンテンツが変更された場合、検証のためにクライアントがサーバーにラウンドトリップする必要はありません。

(2)時々変更する(公開/すべてのユーザーに等しい)

例:index.html、mymodule.nocache.js

  • これらのファイルは、サイトの新しいバージョンが展開されるときに、URLを変更せずにコンテンツを変更します。

  • それらはキャッシュできますが、おそらく毎回再検証するためにラウンドトリップが必要です。

(3)リクエストごとに個別(プライベート/ユーザー固有)

例:JSON応答

  • これらのリソースは、いかなる状況でも暗号化せずにディスクにキャッシュしないでください。(キャッシュできる特定のリクエストがいくつかある場合を除きます。)

おそらく各タイプにどのヘッダーを使用するかについての一般的な考えはありますが、常に何かが欠けている可能性があります。


あなたの答えとコメントとリンクをありがとう。私はまだ少し実験中ですが、私は解決策を導き出すことができると思います!
Chris Lercher 2010年

2
#3を達成することは一般的に不可能です。
EricLaw 2011

回答:


90

私はおそらくこれらの設定を使用します:

  1. Cache-Control: max-age=31556926–表現は任意のキャッシュでキャッシュできます。キャッシュされた表現は、1年間新鮮であると見なされます。

    応答を「無期限」としてマークするために、オリジンサーバー は応答が送信されてから約1年後に有効期限を送信します。HTTP / 1.1サーバーは、1年以上先の有効期限を送信しないでください。

  2. Cache-Control: no-cache–表現は、任意のキャッシュでキャッシュできます。ただし、キャッシュは、キャッシュされたコピーを解放する前に、検証のためにオリジンサーバーにリクエストを送信する必要があります。
  3. Cache-Control: no-store –キャッシュは、いかなる条件下でも表現をキャッシュしてはなりません。

詳細については、MarkNottinghamのキャッシングチュートリアルを参照してください。


1
@Gumbo:一つのこと、私はかなり確信しておよそIが設定する必要があること、ですよ公共:私は、Firefoxをしたい時にHTTPSを使用しながら、ディスクへのパブリックファイルをキャッシュする3+、stackoverflow.com/questions/174348/...
クリスLercher

2
IEなどの一部のブラウザは、Cache-Control:no-cacheをno-storeであるかのように扱い始めています。これは確かにRFCに準拠していませんが、機密データが暗号化されずにディスクに保存されるのを防ぐためにキャッシュなしを使用するという多くの人が犯した間違いを「修正」するために意図的に行われています。
AviD 2010年

1
@chris_l、私はこのリンクに出くわしました:palisade.plynt.com/issues/2008Jul/cache-control-attributes 。以前のバージョンがどのように動作したかは覚えていませんが、IE7もこれを行ったと思います。
AviD 2010年

2
また、FirefoxはHTTPSリソースをキャッシュするためにCache-ControlにPUBLICを必要としなくなりました。しかし、全体として最善の策は、たとえばFiddlerを使用して、トラフィックを監視しながらサイトをテストすることです。
EricLaw 2011

3
100年のキャッシュ制御値を設定することはお勧めしません。まず、仕様では最大1年を推奨しています。次に、68年を超える値を指定すると、IE8以下の有効期限がすぐに切れます。blogs.msdn.com
b

-2

ケース1と2は実際には同じシナリオです。Cache-Control: publicサイトのビルド番号/バージョンを含むURLを設定して生成し、永久に存続する可能性のある不変のリソースを用意する必要があります。またExpires、クライアントが鮮度チェックを発行する必要がないように、1年以上先にヘッダーを設定する必要があります。

ケース3の場合、柔軟性を最大化するために次のすべてを実行できます。

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"

新しいビルド用に異なるURLを使用することは、おそらくオプションではありません。a)これにより、クライアントは永久にキャッシュ可能なファイルを再ダウンロードする必要があります。彼らはそれを避けるためにユニークな名前を取得します。b)私のサイトへのメインURLはちょうどhttps://www.example.com/c)ブックマークが常に私のサイトの最新バージョンを参照するようにしたい(想像してみてください、stackoverflow質問へのブックマークにはサイトのビルド番号が含まれます)。
Chris Lercher 2010年

こんにちはクリス、このアプローチは一般的にドキュメントではなくCSSとJSリソースに使用されます。ドキュメント識別子には適用されないことに同意します。その場合は、ヘッダーにcache-control public、Last-Modified、etagを設定するだけで、毎回鮮度チェックが行われ、変更がない場合は304のみが返送されます。前回のダウンロード以降。または、JSを介して各ページの実際の動的ページコンテンツをダウンロードして、効果的なキャッシュを可能にしながらURLを保持することもできます。
Andrew L

はい、それはほとんど同じ方法です、GWTは私のためにこれを処理します:私のindex.html(時々変わる)はmymodule.nocache.js(時々変わる)を含みます、そしてそれは正しい永久にキャッシュ可能なファイル(jsの大部分、GWT管理画像バンドル、...)それが私に残している唯一のことは、各タイプに正しいhttpヘッダーを設定することです。これらのヘッダーは転送量の大部分を占めるため、最小限に抑えたいと思います。したがって、たとえばLast-ModifiedETagの両方などが必要ですか?
Chris Lercher 2010年

「Expires」は、実際には数値0ではなく日付である必要があります。「Date」ヘッダーと同じ値である必要があります。mnot.net/cache_docsを
Luke Hutchison
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.