1

これが実際には古いものであることは知っていますが、これと、それが開始されたときにどのように機能するはずだったかについて、本当に質問を受けました. したがって、クライアントに送り返すことができる少なくともこれら 4 つの重要なキャッシュ ヘッダーを取得しました ( Last-ModifiedCache-ControlExpiresおよびETag) 。

質問 2.2 の状況例:

それで、記事のあるサイトを手に入れたとしましょう。15分~7日おきに新しい記事があるかもしれません。そのため、クライアントが常に最新バージョンを取得できるように、 と を 15 分間キャッシュするように設定Cache-Controlしました。Expires

私が考えていることETagLast-Modified現時点で:

そこにコンテンツのハッシュを入れるだけで、==の304場合にクライアントを送信できます。If-None-MatchETag

>=の304場合、クライアントを送信できます。If-Modified-SinceLast-Modified

質問

  1. すべてのブラウザをサポートする必要がCache-Control あり Expiresますか?
  2. コンテンツがコンピューターにキャッシュされる期間をブラウザーに伝えるだけ のようCache-Controlに見えますか?Expires
    • ETagだから私はいつ送信すべきかをLast-Modified知るためにしか使用できませ304んよね?
    • だから私はちょうど設定Cache-ControlExpires、永遠にクライアントに新しいバージョンを送信したり、それを変更しETagたりすることができLast-Modifiedますか?
      • これは私のブラウザでは機能しますが、すべてのブラウザで機能しますか?
  3. すべてのブラウザをサポートする必要がETag あり Last-Modifiedますか?
  4. Pragmaに似た別のキャッシュ ヘッダーのように見えCache-Controlます。どのブラウザが使用してPragmaおり、必要ですか?
4

1 に答える 1

3

すべてのブラウザをサポートする必要がCache-ControlありExpiresますか?

Cache-Controlは HTTP 1.1 で導入されたため、HTTP 1.1 をサポートするクライアントでのみサポートされます。ExpiresHTTP 1.0 以降でサポートされています。両方が指定されている場合は、Cache-Control優先され、Expires完全に無視されます。


コンテンツがコンピューターにキャッシュされる期間をブラウザーに伝えるだけのようCache-Controlに見えますか?Expires

基本的に、はい。Cache-Controlが存在しない (したがってExpires使用される) か、 で正しく設定されている場合max-age


ETagつまり、304 をいつ送信する必要があるかをLast-Modified調べるためにしか使用できませんよね?

ここで、あなたの質問は混乱し始めます。実際にはIf-None-MatchIf-Modified-Sinceヘッダーを確認する必要があります。ETag通常、ブラウザーは条件付き GET 要求でそれらの 1 つだけを送信し、それがサーバー内のまたはの現在の値と一致する場合、ヘッダーLast-Modifiedと共に 304 を返します。ETag何らかの理由でブラウザが両方を送信する場合は、無視してかまいませんIf-Modified-Since


だから私はちょうど設定Cache-ControlExpires、永遠にクライアントに新しいバージョンを送信したり、それを変更しETagたりすることができLast-Modifiedますか?

いいえ。永久に設定すると、エンドユーザーが (Ctrl)+F5 を押すまで、クライアントは (条件付きの) 要求を送信しません。Cache-Control: max-ageまたはを目的のキャッシュ時間に設定する必要がありますExpires(将来的には 15 分に?)。


これは私のブラウザでは機能しますが、すべてのブラウザで機能しますか?

テスト方法に注意してください。F5 を押すと、常に条件付き GET 要求が送信されます。しかし、単純なページ間のナビゲーションとフォームの送信 (現実の世界のように) では、条件付きの GET 要求は送信されません! Ctrl+F5 を押すと、キャッシュが無視され、新しい GET リクエストが送信されます。


すべてのブラウザーをサポートするために ETag と Last-Modified が必要ですか?

すべてのブラウザが両方をサポートしています。If-None-MatchETagがサーバーから受信され、ブラウザが条件付き GET 要求を実行する必要がある場合、ブラウザは ETag を介して送り返す必要があります。はLast-Modifiedオプションであり、通常ETagはリソースに存在しない場合にのみ送信されます。RFC 2616 セクション 13.3.4も参照してください。


Pragma は Cache-Control に似た別のキャッシュ ヘッダーのように見えますが、Pragma を使用しているブラウザーはどれですか? また、Pragma は必要ですか?

キャッシュする場合は必要ありません。キャッシュしたくない場合にのみ必要です(ただし、人口が現在着実に減少している HTTP 1.0 クライアント/プロキシをカバーするため)。


Java に精通している場合、または少なくとも Java を解読できる場合は、次の記事が役立つことがあります: FileServiet support resume and caching and GZIP

以下も参照してください。

于 2013-08-26T20:26:16.370 に答える