1. ホーム
  2. http

[解決済み] Cache-Control: privateとは何ですか?

2022-04-26 08:55:25

質問

にアクセスすると chesseng.herokuapp.com 次のようなレスポンスヘッダが表示されます。

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss

と表示され、ページを更新すると

Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss

ということで、キャッシュが効いているようです。もしそれがキャッシュのために機能するならば、何のために 期限切れ キャッシュ制御:max-age . さらに混乱を招いたのは、このページを https://developers.google.com/speed/pagespeed/insights/ というメッセージが表示され、ブラウザのキャッシュを利用するように指示されます。

解決方法を教えてください。

ウェブサーバーがヘッダーを含んでいないにもかかわらず、なぜキャッシュが機能するのかという質問にお答えします。

  • 期限切れになります。 [a date]
  • Cache-Control: max-age= [seconds]

サーバは親切にも、中間プロキシにコンテンツをキャッシュしないよう依頼しました (つまり、この項目は プライベート キャッシュ、つまり自分自身のローカルマシンのみ)。

  • キャッシュコントロール:プライベート

しかし、サーバーはキャッシュのヒントのようなものを入れ忘れたのです。

  • を入れ忘れた。 有効期限 (ブラウザはキャッシュされたコピーをその日付まで使用することを知る)
  • を入れ忘れた。 最大年齢 (ブラウザがキャッシュされたアイテムの有効期限を知ることができるように)
  • を入れ忘れた。 Eタグ (ブラウザが条件付きリクエストを行えるように)

しかし、彼らは した を含む。 最終修正時刻 の日付がレスポンスに含まれます。

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

ご利用のブラウザ した。 は、サーバーにリクエストを送信し、レスポンスを待つという往復の遅れはありますが、静的コンテンツを再ダウンロードする手間が省けました。

なぜ マックスエイジ ? なぜ 期限切れ ?

なぜなら 最終修正日 は吸う。

サーバーにあるもの全てではありません があります。 には、それに関連する日付があります。その場でページを作っていると、日付が関連付けられていない - それは . でも、ユーザーがホームページを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 は、レガシー (1998年頃) である現代の Cache-Control: max-age ヘッダがあります。

  • Expires : 日付を指定する (ヤバイ)

  • max-age 秒を指定した場合 (良し)

  • そして、もし 両方 が指定された場合、ブラウザは max-age :

      200 OK
      Cache-Control: max-age=60
      Expires: 20180403T192837 
    
    

1998年以降に作成されたウェブサイトは Expires を使用し、代わりに max-age .

ETagとは何ですか?

ETag 最終更新日 ただし、日付である必要はなく、単に something .

データベースから商品のリストを取り出す場合、サーバーは最後の rowversion を日付ではなく、ETagで指定します。

200 OK
ETag: "247986"

私の ETag は、静的リソース(例:画像、js、css、フォント)の SHA1 ハッシュ、またはキャッシュされたレンダーページ(例:これは Mozilla MDN wiki が行っていることです;彼らは最終マークアップをハッシュ化しています)のハッシュです。

200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

という条件付きリクエストの場合と全く同じです。 最終更新日 :

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 以外のものに対して機能するからです。 ファイル の概念を持つもの、あるいは 日付 . それはただ