Cache-Control的优先级:max-age和ETag

时间:2016-09-15 11:25:05

标签: browser-cache cache-control

我使用AWS S3存储桶保存图像文件。我为每个文件添加了一个元数据max-age=315360000

图像文件的响应头如下。在标题中,Cache-Control:max-age = 315360000和etag都已设置。

Cache-Control:max-age=315360000
Date:Thu, 15 Sep 2016 11:03:31 GMT
ETag:"326ae27d85f6d847f819e19955c0f0aa"
Last-Modified:Tue, 06 Sep 2016 03:23:26 GMT
Server:AmazonS3
x-amz-id-2:O/kt/JoZ/hmxSXUWGvkVLudMs6H4MDk8vgS2hIuZvAgGKMdYJsqSiqx/PnpT5AGsJ6FH8O3MGb4=
x-amz-request-id:9289AFE7D3BACB96
x-amz-version-id:P7bZwWZ9PO4I__ZHzwk5tXeiaU6QLSWJ

问题1:哪一个具有更高优先级来控制缓存?

如果Cache-Control:max-age=315360000具有更高的敏感度,则下一个请求的响应应为200 from cache。如果ETag具有更高的敏感度,则下一个请求的响应应为304

我在Mac chrome上进行测试(版本53.0.2785.89(64位))。我的行为很奇怪。

  • 测试1 - 访问图像网址到浏览器。回复是304
  • 测试2 - 访问包含图像元素的html文件 参考图像。回复是200 from cache

我使用chrome dev工具将这两个请求复制为curl命令行。

Test 1 curl command lines

curl 'http://s3.cn-north-1.amazonaws.com.cn/xxxx/xxxx.jpg' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36' -H 'Referer: http://pano.shejijia.com/?locale=zh-CN&data=http%3A%2F%2Fjuran-prod-contents.s3.cn-north-1.amazonaws.com.cn%2FAsset%2Fpanos%2F9b57a2b1-0ff7-4c79-ad3d-3343d95f2ad9%2F2702d299-c269-442f-804b-49d94296454e.json&mode=navipano&designId=9b57a2b1-0ff7-4c79-ad3d-3343d95f2ad9' -H 'Origin: http://pano.shejijia.com' --compressed

Test 2 curl command lines

curl 'http://s3.cn-north-1.amazonaws.com.cn/xxxx/xxxx.jpg' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'If-None-Match: "d88e24d354fc3b4b43530c0bfe338b01"' -H 'Connection: keep-alive' -H 'If-Modified-Since: Tue, 06 Sep 2016 05:54:16 GMT' --compressed

您可以看到chrome生成两个不同的curl命令。我想chrome在两种情况下以不同的方式解释了缓存头。

问题2:为什么chrome会在上述两种情况下以不同方式解释缓存标头?

问题3:如何使用相同的方式来响应缓存标头?任何一个都可以。

0 个答案:

没有答案