当前位置: 首页 > 知识库问答 >
问题:

Safari未发送“If Modified Since”和“If None Match”标题

糜昌胤
2023-03-14

我正在用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是否发送匹配的标头('HTTP/1.1 304 Not Modified')。这与Chrome和Firefox完美配合。但是,Safari(版本6.0.2)不发送“If-Modified-From”和“If-Node-Match”标头。这是Safari在第二页点击时发送的请求标头:

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 浏览器发送正确的请求标头?我可以更改哪些内容?

非常感谢。

共有2个答案

太叔永新
2023-03-14

我最终通过寻找各种大型网站发送的标头来解决这个问题,并最终得到了

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

这对我来说Safari。

范楚
2023-03-14

If Modified Since的注释警告不要使用与Last Modified响应头内容不同的内容:

注意:如果客户端在If-Modified-From标头中使用任意日期,而不是从Last-Modified标头中获取的日期用于同一请求,则客户端应该知道该日期是在服务器对时间的理解中解释的。

您的响应不包含Last Modified,但即使包含,规范中也没有规定用户代理必须或应该发送if Modified-Since,他们只是可以发送。

至于为什么Safari不发一个If-non-Match难倒我;您的ETag看起来有效。

同样,一般来说,规范中没有任何内容说明必须缓存,只是当您这样做时,必须遵守缓存控制。因此,这是一种有点不对称的关系,您可以强制(透明)缓存以与源服务器重新检查,但作为源服务器,您不能强制用户代理进行缓存。

Safari只是部分自由软件。如果添加最后修改没有帮助,那就没什么了。

 类似资料:
  • 我已经尝试了我在这里找到的解决头问题的方法,例如,在发送之前检查ajax的版本。我基本上有一个应用程序,里面有一个,这个与一个脚本通信,这个脚本将添加到访问的页面,然后它执行一个请求。我使用作为前端。 问题是,它没有发送我提出的定制请求。尽管如此,它以前是100%有效的。我真的不记得是什么引起的。 my electron应用程序的主 ipc.js文件 myajaxfile.jsajax部分(基本模

  • 我试图将用于需要基本HTTP身份验证的第三方服务。我正在使用。以下是我到目前为止的结论:

  • 我正在使用docker运行datadog代理 我想使用dogstatsd发送自定义指标。当我运行 我可以在wireshark中看到,udp数据包成功地从源到目标,但这个指标没有提交给datadog。我缺少一些配置吗?

  • 问题内容: 我的Web服务器托管在具有基本身份验证的Apache Tomcat 7中。我有Tomcat用户“ tomcat”,角色为“ tomcat”,密码为“ tomcat”。以下分别是我在客户端的web.xml文件和脚本片段。 Web.xml 客户端脚本: 我很确定Web服务和基本身份验证没有问题。但是从客户端脚本中,没有发送身份验证标头。我也尝试过 但是请求发送时没有身份验证头。任何帮助将不

  • 我是一个使用angular的新手,我正在努力学习一点,但我不能使用令牌进行简单的获取。我做了很多研究,最后总是得到这段代码。 对于我的后端,我使用Kotlin/Springboot并配置了Cors。 即使如此,当尝试这样做请求我得到这个错误。 访问位于“”的XMLHttpRequesthttp://localhost:5000/api-v1/来源的帐户/列表 -- 果心js:15713错误Http

  • 问题内容: 我正在尝试发送带有标头的XMLHttpRequest并添加FormData。有没有一种(优雅的)方式我可以做这样的事情: 问题答案: 您无法在发送时指定标题,因为该标题会被浏览器自动设置为。您也可以设置其他标题,请尝试以下操作: