43

キャッシュ制御ヘッダー「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の違いは何ですか?

4

2 に答える 2

77

私は最終的にそれを理解しました。ここに説明とテストされた解決策があります。

次のサイトは私の観察を確認します: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/ )もあります。

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

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

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

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

キャッシュなしを使用せず、代わりに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を含めることはできません
于 2011-02-22T21:48:58.077 に答える
-2
   $last_modified = filemtime($_SERVER['SCRIPT_FILENAME']);

   session_cache_limiter(FALSE);

   header("Content-Type: text/css");
   header("Cache-Control: max-age=1, must-revalidate, private");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified) . " GMT");

   if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]))
   {
      if(strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified)
      {
         header("HTTP/1.1 304 Not Modified");
         exit;
      }
   }
于 2011-08-05T00:05:19.180 に答える