web-dev-qa-db-ja.com

304(変更されていない)応答の回避

サーバーからのHTTPステータス304応答を回避するのに十分なExpiresDefault Apacheディレクティブですか? ExpiresDefault "access plus 10 years"を設定しましたが、ローカル PHPMyFAQ サイトでページを開くたびに、"GET /assets/template/default/css/style.min.css?v=1 HTTP/1.1"に対する304応答のログエントリが表示されます。ブラウザのキャッシュを空にしても何も変わらないようです。

11

サーバーが送信するExpires:ヘッダーは、将来の304応答とは何の関係もありません。これは、リソースが「古くなっている」と見なす前にクライアント/プロキシが待機できる時間の見積もりの​​みを提供します。クライアントはこのヘッダーを監視する必要はありません、必要に応じて同じリソースに対して新しい要求を自由に行うことができます。だから、あなたの質問に簡単に答えるために:

いいえ、送信するヘッダーに関係なく、ユーザーが同じリソースに対して新しいリクエストを行うことを明示的に防ぐことはできません。

304応答は、クライアント要求のIf-MatchまたはIf-Modified-Sinceヘッダーが一致した結果です。ここで起こっていることは、サーバーが次のヘッダーのいずれかまたは両方を元の応答で送信していることです。

  • ETag
  • Last-Modified

次に、クライアントは、リソースがキャッシュされたバージョンから変更されたかどうかを確認するために、要求とともに次のヘッダーを送り返します。

  • If-Match(ETag)
  • If-Modified-Since(最終変更)

これらの条件のいずれかが当てはまる場合、サーバーは観察した304 Not Modified応答を送信し、クライアントはキャッシュされたバージョンのリソースを安全に提供できることを認識します。

コンプライアンスノート

RFC 2616 セクション14.21 実際には、準拠サーバーがExpiresヘッダーを1年以上送信することを禁止しているため、 "アクセスプラス10を使用しないでください。年」そもそも:

HTTP/1.1サーバーは、1年以上先の有効期限を送信しないでください。

13
rdlowrey