我正在使用 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 在第二页点击时发送的请求标头:
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 发送正确的请求标头?
我能改变什么?
谢谢你!
如果-修改-自
的注释如果-修改-自警告不要使用与内容不同的内容Last-Modified
响应头:
注意:如果客户端在 If-Modified-Since 中使用任意日期
标头而不是从 Last-Modified 标头中获取的日期
同样的请求,客户端应该意识到这一事实
日期以服务器对时间的理解来解释。
您的回复不包含上一次更改,但即使确实如此,规范中也没有任何内容表明用户代理必须或应该发送 If-Modified-Since,他们只是可以。
如果-无-匹配
至于为什么 Safari 不发送如果-无-匹配打败我;你的ETag看起来有效。
一般情况下强制执行缓存
同样,一般来说,规范中没有任何内容说您必须缓存,只是当您这样做时,您必须遵守缓存控制。所以这是一种不对称的关系,您可以强制(透明)缓存与源服务器重新检查,但作为源服务器,您不能强制用户代理进行缓存。
我能做什么呢?
Safari 仅partly免费软件。如果添加 Last-Modified 没有帮助,那就没什么了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)