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

时间:2012-12-09 17:34:29

标签: 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 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发送正确的Request-Header? 我能改变什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我最终通过查找各个大型网站发送的标题来解决这个问题,最终结束了

portal

我正在为Safari工作。