HTTP: 有効期限と検証キャッシュの組み合わせ 質問する

HTTP: 有効期限と検証キャッシュの組み合わせ 質問する

次のような状況で HTTP キャッシュ ヘッダーを作成するのに問題があります。

私たちのサーバーには、おそらく週に 2 回ほど変更される大量のデータがあります。ブラウザーでこのデータをキャッシュできるようにしたいと考えています。また、ネットワークが信頼できないため、条件付き取得の待ち時間を最小限に抑えたいと考えています。

私が目指す最終的な動作は次のとおりです。

  1. クライアントは、これまで見たことのないリソースを要求します。
  2. サーバーは、ETag とmax-age(24 時間) とともにリソースで応答します。
  3. 24 時間が経過するまで、クライアントはキャッシュされたリソースを使用します。
  4. 有効期限が切れると、クライアントは検証リクエストを実行します(If-None-Match: [etag]
  5. リソースが変更されていない場合:
    • サーバーは次のように応答します304 Not Modified
    • クライアントは、既存のリソースの有効期限が24時間後に変更されることを何らかの方法で通知されます。
    • ステップ3に戻る

本質を突き詰めると... 304 応答に新しい を含めることができますか? それとも、後続のリクエストではmax-age元の が尊重されますか?max-age

ベストアンサー1

はい、304 応答には新しいmax-age(または ETag、あるいはその他の応答ヘッダー) を含めることができます。

Firefox 4 を使用して、元の max-age と新しい max-age のどちらが尊重されるかをテストする実験を行いましたが、新しい max-age が尊重されるという答えが返ってきたのでmax-age、やりたいことを実装できるはずです。

は ではなく、応答ヘッダーmax-ageを基準にしていることを覚えておくことが重要です。そのため、サーバーが 24 時間の指示を設定するときは常に、「今から 24 時間後」と言っていることになります。したがって、それが必要な内容であると仮定すると、 をまったく変更する必要はなく、常に 86400 を返すだけです。DateLast-Modifiedmax-agemax-age

とにかく、これが私の実験の概要とダンプです。基本的に、ETag を設定し、max-age120 秒に設定したテスト URL にアクセスしました。それに応じて、サーバーは次の応答ヘッダーを含むページを返しました。

HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 23:48:51 GMT
Cache-Control: max-age=120
Etag: "901ea3d0ac9303ae4855a09676f96701"
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT

次に、アドレス バーで「Enter」キーを繰り返し押してページを読み込みました (ただし、ハード リロードは強制しません)。Firefox はキャッシュからページを繰り返しリロードしたため、ネットワーク トラフィックはありませんでした。その後、120 秒が経過し、次に Enter キーを押したときに、Firefox は予想どおり、条件付き GET をサーバーに送信しました。サーバーからの要求と応答は次のようになりました。

GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"

HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:50:54 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240

304 応答では、サーバーがmax-age120 秒から 240 秒に変更されていることに注意してください。

では、120 秒後に何が起こるかが大きな疑問です。Firefox は新しいものを尊重してmax-ageキャッシュからページの読み込みを続けるのでしょうか、それともサーバーにアクセスするのでしょうか。答えは、キャッシュからページの読み込みを続け、240 秒が経過するまで再リクエストを行わなかったということです。

GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"

HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:54:56 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240

さらに 240 秒のサイクルを繰り返しましたが、予想どおりに動作しました。これで質問の答えがわかったと思います。

RFC経過時間の計算がどのように実装されるか、および他の Cache-Control パラメータがどのように機能するかについて説明します。すべてのブラウザとプロキシがルールに従うという保証はありませんが、現時点では HTTP 1.1 はかなり古く、ほとんどのブラウザとプロキシが Firefox と同じように動作すると予想されます。

注記:これらのサンプルダンプでは簡潔にするために、ホスト、接続/キープアライブ、コンテンツのエンコーディング/長さ/タイプ、ユーザーエージェントなどの無関係なヘッダーを削除しました。

おすすめ記事