Webサーバーにヘッダーが含まれていなくても、キャッシュが機能する理由についての質問に答えるには:
- 期限切れ:
[a date]
- キャッシュ制御: max-age =
[seconds]
サーバーは、コンテンツをキャッシュしないように中間プロキシに親切に要求しました(つまり、アイテムはプライベートキャッシュにのみキャッシュする必要があります。つまり、自分のローカルマシンにのみキャッシュします)。
しかし、サーバーはあらゆる種類のキャッシングヒントを含めるのを忘れていました。
- Expiresを含めるのを忘れたため、ブラウザはその日付までキャッシュされたコピーを使用することを知っています
- 彼らはMax-Ageを含めるのを忘れたので、ブラウザはキャッシュされたアイテムがどれだけ有効であるかを知っています
- E-Tagを含めるのを忘れたため、ブラウザは条件付きリクエストを実行できます
ただし、応答には最終変更日が含まれてい ました。
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
ブラウザはファイルが変更された日付を知っているため、条件付きリクエストを実行できます。サーバーにファイルを要求しますが、ファイルが2012/10/16 3:13:38以降に変更されている場合にのみファイルを送信するようサーバーに指示します。
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
サーバーは要求を受信し、クライアントがすでに最新バージョンを持っていることを認識します。クライアントを送信し200 OK
、その後にページのコンテンツを送信するのではなく、キャッシュされたバージョンが適切であることを通知します。
304 Not Modified
ご使用のブラウザーは、サーバーへの要求の送信の遅延に悩まされ、応答を待つ必要がありましたが、静的コンテンツを再ダウンロードする必要がなくなりました。
なぜマックスエイジなのか?なぜ期限切れになるのですか?
Last-Modifiedが悪いので。
サーバー上に存在しないすべてのものがあり、それに関連付けられた日付を。その場でページを作成している場合、それに関連付けられた日付はありません- 今です。しかし、私はユーザーがホームページを15秒間キャッシュできるように完全に喜んでいます。
200 OK
Cache-Control: max-age=15
ユーザーがハンマーを打つF5と、キャッシュされたバージョンを15秒間取得し続けます。それが企業プロキシの場合、同じ15秒のウィンドウで同じページにアクセスする67198ユーザーはすべて同じコンテンツを取得します-すべてクローズキャッシュから提供されます。誰にとってもパフォーマンスの勝利。
追加の利点はCache-Control: max-age
、ブラウザーが条件付き要求を実行する必要さえないことです。
- のみを指定した場合
Last-Modified
、ブラウザはリクエストを実行If-Modified-Since
し、304 Not Modified
レスポンスを監視する必要があります
- を指定した
max-age
場合、ブラウザはネットワークの往復に苦しむ必要さえありません。コンテンツはキャッシュからすぐに出てきます
「Cache-Control:max-age」と「Expires」の違い
Expires
現代(1998年頃)のCache-Control: max-age
ヘッダーに相当するレガシーです。
1998年以降に作成されたWebサイトは使用できExpires
なくなり、代わりにを使用しますmax-age
。
ETagとは何ですか?
ETagはLast-Modifiedに似ていますが、日付である必要はなく、何かである必要があります。
データベースから製品のリストを取得している場合、サーバーは最後のrowversion
ものを日付ではなくETagとして送信できます。
200 OK
ETag: "247986"
私のETagは、静的リソース(画像、js、css、フォントなど)またはキャッシュされたレンダリングページのSHA1ハッシュにすることができます(つまり、これはMozilla MDN wikiが行うことです。最終的なマークアップをハッシュします)。
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
そして、Last-Modifiedに基づく条件付きリクエストの場合とまったく同じです。
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
ETagに基づいて条件付きリクエストを実行できます。
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
AnがETag
より優れているLast-Modified
、それはほかのもののために働くので、ファイルの概念が持っている、または物事日付を。それだけです