web-dev-qa-db-ja.com

なぜブラウザーはmax-ageでcache-control publicのリクエストを送信するのですか?

Amazon S3オブジェクトがあり、オブジェクトごとに設定しました

Cache-Control: public, max-age=3600000

それはおよそ41日です。

そして、最小値TTLも3600000で設定されたAmazon CloudFrontディストリビューションがあります。

これは、キャッシュをクリアした後の最初のリクエストです。

GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

そして応答は

HTTP/1.1 200 OK
Content-Type: application/x-javascript
Content-Length: 226802
Connection: keep-alive
Date: Wed, 28 Aug 2013 10:37:38 GMT
Cache-Control: public, max-age=3600000
Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT
ETag: "124752e0d85461a16e76fbdef2e84fb9"
Accept-Ranges: bytes
Server: AmazonS3
Age: 342557
Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront)
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw==

AmazonがCache-Controlを明確に送信していても、ChromeはCacheから読み取るのではなく、2番目のリクエストを行います。

GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "124752e0d85461a16e76fbdef2e84fb9"
If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT

質問:なぜchromeは2回目のリクエストを行うのですか?

Expiresこの動作は、ヘッダーに明示的なExpires属性を設定すると変わります。ブラウザはExpiresヘッダーの後続のリクエストを送信しませんが、キャッシュ制御パブリックの場合は送信します。私のすべてのS3オブジェクトは決して変更されず、不変です。ファイルを変更すると、新しいURLを持つ新しいオブジェクトとして配置されます。

In Page Script Reference Chromeはその後のリクエストを行うことが時々ありますが、ブラウザで実際にURLを入力してこのテストを行いました。 chromeキャッシュされたスクリプトをロードしますが、しばらくしてからサーバーにリクエストを送信することがあります。ここでディスクサイズの問題はありません。Chrome十分なキャッシュスペース。

問題は、すべてのリクエストに対して課金されることです。S3オブジェクトを永久にキャッシュし、Cacheからロードする必要があり、サーバーに接続しないでください。

36
Akash Kava

HTTP応答にetagエントリが含まれている場合、条件付き要求は常に行われます。 ETagはキャッシュ検証タグです。クライアントは常にetagをサーバーに送信して、要素が変更されているかどうかを確認します。

21
woolagaroo

を押すと F5 Chromeでは、alwaysサーバーにリクエストを送信します。これらはCache-Control:max-age=0ヘッダーで作成されます。サーバーは通常、304(Not Changed)ステータスコードで応答します。

を押すと Ctrl+F5 または Shift+F5、同じリクエストが実行されますが、Cache-Control:no-cacheヘッダーを使用するため、通常は200(OK)ステータスコードで、キャッシュされていないバージョンを送信するようサーバーに強制します。

ローカルブラウザのキャッシュを利用していることを確認したい場合は、単に Enter アドレスバーで。

38
Der Hochstapler

Chrome開発者ツールが開いている場合(F12)、Chromeは通常キャッシュを無効にします。

開発者ツールの設定で制御可能です-dev-toolsトップバーの右側にある歯車アイコン。

9
user3841754

特定のページまたはリソースをロードするために更新ボタンを押す場合、if-modified-sinceヘッダーリクエストが毎回送信されます。代わりに、新しいタブで個別のリクエストとして、またはスクリプトまたはHTMLページのリンクを介してページ/リソースをリクエストすると、ブラウザキャッシュ自体からページ/リソースがロードされます。

これは私の場合に起こったことであり、これは一般的な普遍的なケースかもしれません。私は完全には定かではありませんが、これは私が掘って集めたものです。

0
Anirban Roy Das