我正在用PHP生成动态内容。
我发送以下HTTP头:
HTTP/1.1 304 Not Modified
Date: Sun, 09 Dec 2012 17:24:41 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=100
Etag: "237f43b800e655dbe6567f7d32d34c99"
Expires: Sun, 16 Dec 2012 17:24:41 GMT
Cache-Control: max-age=604800
Vary: Accept-Encoding
我稍后检查Etag是否匹配,以发送header('HTTP/1.1 304 Not Modified')
。这在Chrome和Firefox中非常有效。然而,Safari(版本6.0.2)不发送“If-Modified-Since”和“If-None-Match”头。这是Safari在第二个页面命中时发送的Request-Header:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cache-Control: max-age=0
该页面上链接的所有其他文件都会收到正确的Request-Headers和Safari使用的缓存文件或304。
为什么Safari没有发送正确的请求头?我可以更改什么?
谢谢大家!
3条答案
按热度按时间rkkpypqq1#
If-Modified-Since
If-Modified-Since的注解警告不要使用与
Last-Modified
响应头内容不同的内容:注意:如果客户端在If-Modified-Since头中使用任意日期,而不是从Last-Modified头中获取的日期,则客户端应该意识到这个日期是在服务器对时间的理解中解释的。
您的响应不包含Last-Modified,但即使它包含,规范中也没有规定用户代理必须或应该发送If-Modified-Since,它们只是可以。
If-None-Match
至于为什么Safari不发送If-None-Match击败我;您的ETag看起来有效。
常规强制缓存
一般来说,规范中没有说你必须缓存,只是当你这样做时,你必须遵守Cache-Control。所以这是一个不对称的关系,你可以强制(透明)缓存重新检查源服务器,但作为源服务器,你不能强制用户代理缓存。
我该怎么办?
Safari只是一个partly的免费软件。所以没什么,如果添加一个Last-Modified没有帮助。
fykwrbwg2#
我最终解决了这个问题,通过寻找什么标题是由各种大网站发送,并已结束了与
这对我来说是Safari。
3lxsmp7m3#
Safari 16.3(2023年3月)从不为浏览器发起的初始文档GET请求发送If-Modified-Since或If-None-Match。
比较Safari和Chrome浏览器对www.example.com的请求和响应头example.com,它同时使用ETag和Last-Modified。
Safari
重新加载www.example.com时example.com,Safari不会发送If-Modified-Since或If-None-Matches标头。
服务器必须返回包含所有内容的HTTP代码200,因为Safari在请求中不包含缓存信息。
Chrome
当重新加载www.example.com时example.com(不要重新加载太快-Chrome将快速重新加载解释为强制重新加载),Chrome将发送从第一次加载ETag和Last-Modified头填充的If-Modified-Since和If-None-Match头。
服务器返回HTTP代码304,因为ETag没有改变。