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秒のウィンドウで同じページにアクセスする67,198人のユーザー全員が同じコンテンツを取得し、すべてクローズキャッシュから提供されます。誰にとってもパフォーマンスが勝ちます。
追加の利点はCache-Control: max-age
、ブラウザが「条件付き」リクエストを実行する必要さえないことです。
- のみを指定した場合
Last-Modified
、ブラウザはリクエストを実行し、応答If-Modified-Since
を監視する必要があります304 Not Modified
- 指定した場合
max-age
、ブラウザはネットワークのラウンドトリップに苦しむ必要さえありません。コンテンツはキャッシュから直接出力されます。
「Cache-Control:max-age」と「Expires」の違い
Expires
Cache-Control: max-age
は、最新のヘッダーに相当するレガシー(c。1998)です。
1998年以降に作成されたWebサイトはExpires
、これ以上使用せず、代わりにを使用する必要がありますmax-age
。
ETagとは何ですか?
ETagは、日付である必要はなく、単にである必要があることを除いて、Last-Modifiedに似ていsomething
ます。
データベースから製品のリストを取得している場合、サーバーは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