我正在用PHP生成动态内容。
我正在发送以下HTTP-header:
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- send”和"If-None-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发送正确的请求头?我能改变什么?
谢谢!
发布于 2014-04-24 23:43:35
如果-修改-自
If-Modified-Since的注释警告不要使用与Last-Modified响应头内容不同的内容:
注意:如果客户端在If -Modified- uses标头中使用任意日期,而不是在同一请求的Last-Modified标头中使用日期,则客户端应该意识到,此日期是在服务器对时间的理解中解释的。
您的响应不包含Last-Modified,但即使包含,规范中也没有说明用户代理必须或应该发送if -Modified,因为它们可能会发送。
如果-无-匹配
我不明白为什么Safari不发送If-None-Match;您的ETag看起来是有效的。
一般情况下强制执行缓存
同样,一般来说,规范中没有说明必须缓存,只有当您这样做时,您必须遵守Cache-Control。所以这是一种不对称的关系,你可以强制(透明的)缓存来重新检查源服务器,但作为源服务器,你不能强制用户代理缓存。
我能做些什么呢?
Safari只是一个partly自由软件。因此,如果添加Last-Modified无济于事,那也没什么。
发布于 2016-04-20 16:05:45
我最终通过查找不同大站点发送的报头来解决这个问题,并最终得到了
Last-Modified: {some date}
Cache-Control: max-age=0, must-revalidate
Expires: -1这就是我在Safari上的工作。
https://stackoverflow.com/questions/13789855
复制相似问题