2

http 応答ヘッダーを変更するクロム拡張に取り組んでいます。 https://chrome.google.com/webstore/detail/super-cache/fglobbnbihckpkodmeefhagijjcjnbeh/details

main_frame リクエストをキャッシュできません。ただし、静的リクエストのキャッシュを制御できます。

たとえば、http: //apple.com にアクセスすると、main_frame の次のヘッダーが表示されます。

Accept-Ranges:bytes
Cache-Control:max-age=276
Connection:keep-alive
Content-Encoding:gzip
Content-Length:3310
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 Mar 2013 09:24:12 GMT
Expires:Tue, 12 Mar 2013 09:28:48 GMT
Server:Apache
Vary:Accept-Encoding

しかし、URL にアクセスするたびに、ブラウザーはサーバーにアクセスしようとし、最終的に 200 応答を受け取ります。main_frame でキャッシュを有効にするためにヘッダーを設定できるすべての可能な組み合わせを試しました。

ユーザーがクロムのナビゲーションバーからURLにアクセスしてもリクエストが行われないときにそれが必要です。

4

1 に答える 1

2

応答ヘッダーにある種のキャッシュ検証がありません。ETagヘッダーを使用して、一意の応答を識別する値を追加することで、それを制御できます。Apache ETag documentationでそれについて少し読むことができますがETag: [filename]、例の応答ヘッダーに含めるだけです:

Accept-Ranges:bytes
Cache-Control:max-age=276
Connection:keep-alive
Content-Encoding:gzip
Content-Length:3310
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 Mar 2013 09:24:12 GMT
Expires:Tue, 12 Mar 2013 09:28:48 GMT
Server:Apache
ETag: File:"somefile.html"
Vary:Accept-Encoding

これらのETag値には、ファイル名、ファイル サイズ、カスタム値など、セミコロンで区切ることができるほとんどすべての値を含めることができます;。値にスペースが含まれる場合は、二重引用符で囲みます"。例えば:

ETag: File:"YouTube_cd_Fdly3rX8.jpg"; Size:12169

Cache-ControlExpiresおよび変更される可能性のあるその他のヘッダー値 (含まれていて、ブラウザーがそれらを解釈する方法を認識している場合) と共に、ブラウザーのキャッシュ バリデーターの基礎を形成します。

サンプルの応答ヘッダーを見ると、サンプルのmax-age値をCache-Controlより高い値に増やすことができます。この例では、クライアント側で 276 秒間だけキャッシュする必要があることが示唆されています。Expiresヘッダー値も少し短いようです。

これらの値を設定する方法と、ブラウザーがキャッシュ制御ヘッダーを検証する方法の詳細については、RFC2616 のセクション 14.9を参照してください。

編集:Cache-Control Chromeのキャッシュ検証の動作をさらにデバッグ、チェック、および再チェックした後、適切に設定された応答ヘッダーを実際に尊重していないことがわかりました。OP の要求に応じて、この問題を Chrome サポートに報告しました。

Chrome、バージョン 25.0.1364.172 m

リンクされたコンテンツで同じヘッダー応答を尊重しながら、Web サーバーから静的ファイルを提供するときにメイン ドキュメント要求で Cache-Control を軽視します。

テスト設定:

IFRAME (MIME text/html) 内の別の静的 HTML ドキュメントを含む Web サーバー (MIME text/html) から静的 HTML ドキュメントを要求します。IFRAME で提供されたドキュメントには、Web サーバーの応答によってメイン ドキュメントと同じ応答ヘッダーが添付されています。

Date: Thu, 21 Mar 2013 16:29:28 GMT
Expires: Thu, 21 Mar 2013 16:33:59 GMT
Cache-Control: max-age=301, max-stale=299, only-if-cached

予想される行動:

メイン ドキュメントと IFRAME 内で提供されるドキュメントは、最初の要求で少なくとも 301 (max-age) 秒、通常の (非強制的な) 読み込み要求の場合はさらに 299 (max-stale) 秒間、ローカルにキャッシュされます。この 301 秒の時間枠内に、ローカル キャッシュを無効にすることが予想されず (CTRL+F5 による強制更新またはコンテキスト メニュー コマンドの再読み込みなど)、通常のページ読み込み要求 (再入力など) によって開始される後続の要求。アドレスバーの関連する URL) は、ステータスメッセージ 200 OK (キャッシュから) とともにローカルキャッシュからロードされます。ローカルキャッシュ制御情報がそれ以外のことを示していない場合 (同じ URL、有効なキャッシュ時間枠内に要求され、ドキュメントが応答ヘッダーに正しくキャッシュされるようにタグ付けされています)。

問題:

メイン ドキュメントはキャッシュされたコピーを介して読み込まれず、追加のリクエストが Web サーバーに対して行われ、ステータス コード 304 Not Modified が返されます。ただし、IFRAME 内のドキュメントはローカル キャッシュから正しく読み込まれ、ステータス メッセージ 200 OK (キャッシュから) が返されます。

ノート:

cache-control タグまたはそれらの値の組み合わせは、メイン ドキュメントのローカル キャッシュの動作にプラスの影響を与えないようです。一意でない ETag 値を含めても、メイン ドキュメントのキャッシュの問題は解決されません。他の主要ベンダーのブラウザー (IE、Firefox、Opera でテスト済み) は、メイン ドキュメントの Cache-Control ヘッダーを尊重します。

于 2013-03-20T11:51:50.117 に答える