12

我正在使用 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

我稍后检查 Etagheader('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

该页面上链接的所有其他文件都会收到正确的请求标头和 Safari 使用的缓存文件或 304(在适当的情况下)。

为什么不向 Safari 发送正确的请求标头?我能改变什么?

谢谢!

4

2 回答 2

3

If-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 只是部分免费软件。所以没什么,如果添加 Last-Modified 没有帮助。

于 2014-04-24T15:43:34.663 回答
1

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

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

这对我来说是在 Safari 上工作的。

于 2016-04-20T08:05:44.997 回答