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)

Safari 不接受 Cookie 而 FF 和 IE 接受

将Safari URL发送到Quicksilver

Firefox 和 Safari 不在 Service Worker 请求中发送自定义 http 标头