php Safari不发送“If-Modified-Since”和“If-None-Match”标头

cnjp1d6j  于 2023-04-10  发布在  PHP
关注(0)|答案(3)|浏览(144)

我正在用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没有发送正确的请求头?我可以更改什么?
谢谢大家!

rkkpypqq

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没有帮助。

fykwrbwg

fykwrbwg2#

我最终解决了这个问题,通过寻找什么标题是由各种大网站发送,并已结束了与

Last-Modified: {some date}
Cache-Control: max-age=0, must-revalidate
Expires: -1

这对我来说是Safari。

3lxsmp7m

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没有改变。

相关问题