8

不要なトラフィックを回避するために、ブラウザに常に「If-Modified-Since」リクエストヘッダーを追加してもらいたい(初回を除く)。

応答ヘッダーは次のとおりです。

Accept-Ranges:bytes
Cache-Control:max-age=0, must-revalidate
Connection:Keep-Alive
Content-Length:2683
Content-Type:text/html; charset=UTF-8
Date:Thu, 05 Apr 2012 13:06:19 GMT
Keep-Alive:timeout=15, max=497
Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT
Server:Apache/2.2.21 (Red Hat)

FF11とIE9はどちらも「If-Modified-Since」を送信し、応答として304を取得しますが、Chrome18は送信せず200を取得します。

なんで?Chromeに「If-Modified-Since」ヘッダーを送信させるにはどうすればよいですか?それが重要かどうかはわかりませんが、すべてのリクエストはHTTPSを経由します。

4

6 に答える 6

27

私はこの問題をしばらく追跡してきましたが、見つけたものを共有したいと思いました。

「ルールは実際には非常に単純です。証明書にエラーがあると、そのページはキャッシュされません。」

https://code.google.com/p/chromium/issues/detail?id=110649

自己署名証明書を使用している場合、ページが読み込まれるように例外を追加するように Chrome に指示しても、そのページからのリソースはキャッシュされず、後続のリクエストには If-Modified-Since ヘッダーがありません。

于 2013-07-18T07:13:37.343 に答える
6

私はちょうど今この質問を見つけました.ChromeのIf_Modified_Since動作に困惑した後、私は答えを見つけました.

Expiresファイルをキャッシュするという Chrome の決定は、受信したヘッダーに基づいています。Expiresヘッダーには 2 つの主な要件があります。

  1. グリニッジ標準時 (GMT) である必要があります。
  2. RFC 1123 (基本的にはRFC 822の 4 桁の年)に従ってフォーマットする必要があります。

形式は次のとおりです。

Expires: Sat, 07 Sep 2013 05:21:03 GMT

たとえば、PHP では、次のように適切にフォーマットされたヘッダーが出力されます。

$duration = time() + 3600 // Expires in one hour.
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT");

("e" タイムゾーン フラグの代わりに "GMT" が文字列に追加されます。これは、 と共に使用するとgmdate()、フラグが RFC 1123 で無効と見なされる "UTC" を出力するためです。また、PHP 定数 DateTime::RFC1123およびは適切な書式設定を提供しDATE_RFC1123 ないことに注意してください。 、 "GMT" ではなく、時間 [つまり +02:00] で GMT との差を出力するためです。)

詳細については、W3C の日付/時刻形式の仕様を参照してください。

つまり、Chrome はヘッダーがこの正確な形式に従っている場合にのみヘッダーを認識します。これ、ヘッダーと合わせてCache-Control

header("Cache-Control: private, must-revalidate, max-age=" . $duration);

...適切なキャッシュ制御を実装できました。Chrome がこれらのヘッダーを認識すると、送信したページのキャッシュを開始し (クエリ文字列を含む場合でも!)、If_Modified_Sinceヘッダーの送信も開始しました。私はそれを保存された「最終変更」日付と比較し、送り返しましたHTTP/1.1 304 Not Modifiedが、すべてが完全に機能しました。

これがつまずいた他の誰かに役立つことを願っています!

于 2013-09-26T17:54:45.003 に答える
5

私はほぼ同じ動作に気付きました。私の調査結果は次のとおりです。

  • まず、クロムの 200 ステータス インジケータは完全な真実ではありません。「サイズ コンテンツ」列も確認する必要があります。これが「(キャッシュから)」と表示されている場合、リソースは、変更されたかどうかを確認することなく、キャッシュから直接取得されました。

  • 期限切れや最大経過時間の表示がないリソースのこのキャッシュ動作は、最終変更ヘッダーを持つ静的ファイルを要求するときに適用されるようです。chrome (ver. 22):

    1. 初めてファイルを要求します (明らかにキャッシュにないため)。
    2. 2 回目に変更されたかどうかを尋ねます (キャッシュにあるが、更新の兆候がないため)。
    3. 3 回目以降は直接使用します (新しいブラウザー セッションであっても)。
  • 私はこの動作に少し困惑していますが、それが静的であり、かなり前に変更され、前回のチェック以降変更されていない場合、それはかなり合理的です。計算の仕方がわからないけど)。

于 2012-11-05T13:40:26.837 に答える
3

私は同じ問題を抱えていました.Chromeではすべてのリクエストが常にステータスコード200で、他のブラウザでは304でした.

Devtools-Settings-Generalページで(DevToolsが開いている間)キャッシュを無効にしていることがわかった..:)

于 2014-03-03T18:25:39.240 に答える