Php Safari“不发送”;如果修改自";及;如果没有匹配的“;标题

Php Safari“不发送”;如果修改自";及;如果没有匹配的“;标题,php,safari,http-headers,etag,last-modified,Php,Safari,Http Headers,Etag,Last Modified,我正在用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 GM

我正在用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)不会发送“如果修改自”和“如果不匹配”标题。 这是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发送正确的请求头? 我能换什么

谢谢大家!

如果修改自 警告不要使用与上次修改的
响应标题内容不同的内容:

注意:如果客户机在If-Modified-Since中使用任意日期 标题,而不是从上次修改的标题中获取的日期 对于相同的请求,客户机应该知道 日期是服务器对时间的理解

您的响应不包含,但即使包含,规范中也没有说明用户代理必须或应该发送(如果修改),因为它们可能会发送

如果没有匹配 至于为什么Safari不给我发邮件,我很吃惊;你的建议看起来有效

强制执行一般的缓存 同样,一般来说,规范中没有规定必须缓存,只是当您这样做时,必须遵守。所以这是一种不对称关系,您可以强制(透明)缓存以与源服务器重新检查,但作为源服务器,您不能强制UserAgent进行缓存

我能怎么办?
Safari是唯一的自由软件。所以,如果添加最后一次修改没有什么帮助的话,那也没什么大不了的。

我通过查找各个大网站发送的邮件头来解决这个问题,结果是

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

这是我在Safari上的工作。

您是否通过f5/刷新按钮强制刷新?或者更正常地加载页面(提交带有enter键的url字段,或者单击链接)?我这样问是因为它发送了
缓存控制:max age=0
,这有刷新的味道。这些是导航栏中列出的实际请求页面的标题还是链接页面(如页面中的资源)的标题?如果页面是导航栏中请求的页面,Safari似乎不会检查页面缓存,但是如果它是另一个页面(ajax、js、css、img)中的资源,它会首先检查缓存。这些是由“重新加载”(CMD+r)生成的头文件。但是,通过输入网站的URL访问该网站,Safari可以生成相同的请求头,而无需
缓存控制
-行。令我恼火的是,Safari从未在请求头中发送日期或Etag,但Chrome和Firefox会发送。类似的问题:问题已经太老了,无法验证这一点,但你真的是用
304 Not Modified
响应发送这些头,还是仅仅是复制和粘贴错误,而你是以一种简单的方式发送这些头
200 OK
?我遇到了与If-Modified-Since头相同的问题,并且能够让Safari在最初返回最后修改的头和具有相同值的Expires头之后提供它。更多信息,我发布了一个关于这个相关问题的解决方案,它在2020年起作用,并迫使Safari正确返回HTTP 304。