2009-06-25 17 views
19

私の(組み込み)WebサーバーがExpiresヘッダーを送信しているが、ブラウザーがヘッダー設定を尊重していないような状況があります。つまり、ページを更新すると、ブラウザーはキャッシュされるリソースを要求します。HTTP Expiresヘッダーがブラウザで尊重されていませんか?

 
https://192.168.1.180/scgi-bin/ajax/ajax.cgi 

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: image/png,image/*;q=0.8,*/*;q=0.5 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Expires: Wed, 1 Jun 2011 20:00:00 GMT 
Content-Type: image/jpg 
---------------------------------------------------------- 

ajax.cgiは私がキャッシュしたい(static.cgiスクリプト経由)ロゴグラフィック、とhtmlページを返しますが、ブラウザが求めている:以下は、交換なっているのヘッダーですリフレッシュするたびにロゴを表示します。

+0

あなたはHTTPSで作業しています。あなたがそれを期待してキャッシングが行われていないのはそれが理由でしょうか?あなたはHTTPのみのバージョンを試すことができますか? – mark

答えて

13

ブラウザでは何をしていますか?リロードボタンやshift + Reloadのようなものをクリックしたようです。通常、ブラウザはCache-Control: max-age=0ヘッダーを送信しません。つまり、ブラウザはキャッシュされたイメージを破棄し、再度取得する必要があります。

別のページに移動してもう一度戻ると、ブラウザはExpiresヘッダーを尊重する必要があります。

さらに、応答にCache-control: publicヘッダーを追加できます。これにより、プロキシとブラウザは明示的に画像をキャッシュできます。

+1

これは確かに正しいようです。ブラウザ(Firefox?)はmax-age = 0を送信しています。つまり、0より古いレスポンス、つまりオリジンWebサーバーにヒットしたくないという意味です。これは「リフレッシュ」の定義です。あなたのページから離れて、URLに再度貼り付け、何が起こるかを見てください。 –

+0

確かに、私はページをリロードしていましたが、ブラウザがHTMLをリロードすることを期待していましたが、すべてのキャッシュされたリソースをリロードすることはありませんでした。私はシフト・クリック(またはControl +クリック?覚えていない)をして、ブラウザにすべてのリソースのキャッシュを無効にする必要があると考えました。私の理解は間違っていると思いますか? – user128602

+0

これについてもわかりません。私は、F5/ReloadボタンでShiftを押しても押してもブラウザーの動作が異なっていると思います。 – chris166

0

CGIスクリプトにタイムスタンプパラメータがあるようです...これは変更されていませんか?ブラウザは、キャッシュ内の異なるオブジェクトとしてそれぞれの一意のURLを処理する必要があります。したがって、すべての要求で更新される場合、キャッシュされたイメージと一致しません。

また、Expiresフィールドは正確にはRFC 1123形式ではありません。日付の2桁が必要なためです。これは問題かもしれないし、問題ではないかもしれませんが、それは何かを確認することです。ブラウザにはCache-Control: max-age=0が含まれています。これは、そのキャッシュが期限切れになっている可能性があることを示しています。

サーバーがこの検証要求を取得すると、サーバーは現在行われているとおり、304 (Not Modified)または200 (OK)を返します。

+0

いいえ、タイムスタンプは変更されません。 Expiresの日付形式のヒントをありがとう、私はダブルチェックします。 – user128602

16

ページを更新すると、ブラウザーはExpiresヘッダーを無視します。 Webサーバーに連絡してキャッシュエントリが有効かどうかを常にチェックします。理想的には、If-Modified-Sinceリクエストヘッダーを使用して、キャッシュエントリがまだ有効な場合にサーバーが「304 Not modified」を返すことができるようにします。

Last-Modifiedヘッダーを設定していないため、ブラウザは最新のものであることを確認するためにコンテンツの無条件GETを実行する必要があります。

設定のための親指のいくつかのルールが有効期限とのLast-Modifiedは、このブログの記事で説明されています

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

+3

"ページを更新するとブラウザはExpiresヘッダーを無視します。"ありがとうございました!私はこれを知らなかった。 –

+2

これはどのブラウザですか? – Pacerier

0

あなたのHTTPS証明書にエラーがブラウザがヘッダを尊重していないことになります。

httpsを使用せずに試して、プレーンなhttpで動作するかどうかを確認してください。

この回答を見るhttps://stackoverflow.com/a/17716911

関連する問題