web-dev-qa-db-ja.com

IEリソースをキャッシュしますが、常に再検証します

キャッシュ制御ヘッダー「no-cache、must-revalidate、private」を使用すると、ブラウザーはリソースをキャッシュできますが、条件付きリクエストによる再検証が強制されます。これは、FF、Safari、Chromeで期待どおりに機能します。

ただし、IE7 + 8は条件付きリクエストを送信しません。つまり、「If-Modified-Since」がリクエストヘッダーにないため、サーバーはHTTP/304ではなくHTTP/200で応答します。

完全なサーバー応答ヘッダーは次のとおりです。

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private

これはIEバグのようですが、Webに関連するものは何も見つかりませんでした。そのため、別のヘッダーの不在または存在がIE =奇妙な振る舞い?

No-cacheとmax-ageの違いに関する良い議論: Cache-Control:max-age = 0とno-cacheの違いは何ですか?

43
alienhard

私は最終的にそれを理解しました。以下に説明とテスト済みのソリューションを示します。

次のサイトは私の観察を確認します: http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

IEは 'no-cache'ディレクティブを使用してページをローカルに保存しないため、常に無条件のリクエストを送信します。

MSサポート記事もあります- https://support.Microsoft.com/help/234067/ -これはこれを確認します:

「Internet Explorerは、HTTP 1.1 Cache-Controlヘッダーをサポートします。これにより、no-cache値が指定された場合に特定のWebリソースのすべてのキャッシュが防止されます...」

この動作は完全に間違っているわけではありませんが、RFC 2616(sec。14.9.1)が意図したものではありません。 「キャッシュなし」については、「...キャッシュは、Originサーバーとの再検証に成功せずに、後続の要求を満たすために応答を使用してはならない」と述べています。そのため、応答はキャッシュできますが、再検証する必要があります。 IEを除く主要なブラウザは、応答をキャッシュして再検証します。リクエストの保存を防ぐために、「no-store」Cache-Controlディレクティブがあります。

要約すると、IEは 'no-cache'を 'no-store'として扱います。

そして、ソリューションは、IEと他のブラウザに対する条件付きリクエストを一貫した方法で有効にします:

No-cacheを使用しないで、代わりにExpiresヘッダーを過去に設定します(または-1、同じ効果があります)。 IEは、他の主要なブラウザと同様に、条件付きリクエストを送信します。 (注、キャッシュを妨げるIE Varyヘッダーバグにも注意する必要があります。)

これらは重要なヘッダーフィールドです。

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • バリデーターとしてLast-Modified(またはETag)が必要です
  • Expires -1は、リソースが古く、再検証する必要があることを示します
  • Cache-Controlにno-cacheまたはno-storeを含めることはできません
74
alienhard