Safari 不发送“If-Modified-Since”和“If-None-Match”标头
Posted
技术标签:
【中文标题】Safari 不发送“If-Modified-Since”和“If-None-Match”标头【英文标题】:Safari not sending "If-Modified-Since" and "If-None-Match" headers 【发布时间】:2012-11-27 05:04:28 【问题描述】:我正在使用 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
该页面上链接的所有其他文件都会收到正确的请求标头和 Safari 使用的缓存文件或 304(在适当的情况下)。
为什么不向 Safari 发送正确的请求标头? 我能改变什么?
谢谢!
【问题讨论】:
您是否通过 f5/刷新按钮强制刷新?或者更正常地加载页面(使用输入键提交 url 字段,或单击链接)?我问是因为它发送了Cache-Control: max-age=0
,闻起来很清爽。
这些是在导航栏中列出的实际请求页面的标题还是链接页面(例如页面内的资源)?如果是导航栏中请求的页面,Safari似乎不会检查页面缓存,但如果它是另一个页面中的资源(ajax,js,css,img),它会先检查缓存。
这些确实是由“重新加载”(CMD + r)生成的标题。然而,通过输入它的 URL 访问该站点可以让 Safari 生成相同的 Request-Header,只是没有 Cache-Control
-Line。令我恼火的是 Safari 从不发送请求标头中的日期或 Etag,但 Chrome 和 Firefox 会。
类似问题:***.com/questions/5616015/…
问题太老了,无法验证这一点,但您是否真的以304 Not Modified
响应发送这些标头,还是只是复制和粘贴错误,您在@987654328 中发送这些标头@?
【参考方案1】:
If-Modified-Since
If-Modified-Since 的注释警告不要使用与 Last-Modified
响应标头内容不同的内容:
注意:如果客户端在 If-Modified-Since 中使用任意日期 标头而不是取自 Last-Modified 标头的日期 同样的请求,客户端应该知道这个事实 日期在服务器对时间的理解中被解释。
您的回复不包含Last-Modified,但即使包含,规范中也没有规定用户代理必须或应该发送 If-Modified-Since,他们只能发送。
如果没有匹配
至于为什么 Safari 不发送If-None-Match 让我很吃惊;您的 ETag 看起来有效。
一般执行缓存
一般来说,规范中没有说您必须缓存,只是当您这样做时,您必须遵守Cache-Control。所以这有点不对称关系,你可以强制(透明)缓存与源服务器重新检查,但作为源服务器,你不能强制用户代理缓存。
我该怎么办?
Safari 只是partly 的免费软件。如果添加 Last-Modified 没有帮助,那就没什么了。
【讨论】:
我遇到了关于 If-Modified-Since 标头的相同问题,并且在最初返回 Last-Modified 标头和具有相同值的 Expires 标头后,能够让 Safari 提供它。更多信息,我发布了关于这个相关问题的解决方案,***.com/questions/5616015/…【参考方案2】:我最终通过查找各个大型网站发送的标头来解决这个问题,并最终得到了
Last-Modified: some date
Cache-Control: max-age=0, must-revalidate
Expires: -1
这对我来说是在 Safari 上工作的。
【讨论】:
这在 2020 年有效,并强制 Safari 正确返回 HTTP 304。以上是关于Safari 不发送“If-Modified-Since”和“If-None-Match”标头的主要内容,如果未能解决你的问题,请参考以下文章
发送 POST 数据时阻止 Safari 规范化 Unicode?
Safari 未能使用 Angular 的 HttpClient 发送有效的 GET 请求
FireFox 不发送 CORS 请求(使用 jQuery)