3

当我生成一个页面时,我发送标题

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Last-Modified: Mon, 04 Apr 2011 20:08:33 GMT
Vary: Accept-Encoding
Date: Mon, 11 Apr 2011 01:36:21 GMT
Content-Length: 3019

然后,当我再次尝试获取此页面时,所有浏览器都发送正确的请求并获得 304 答案,但 Safari 除外 - 它从不发送 if-modified-since。它总是重新加载整个页面,即使它没有被改变

Safari 的这种行为是否已知以及如何使 Safari 以正确的方式工作?

4

4 回答 4

2

Bart Lateur 写了一篇关于此的文章,其中有一段关于 Safari 的说明:

Safari 更进一步:如果标头不是 http 标准格式的日期,那么标头就会被简单地删除。它根本不会在下一个请求中发送 If-Modified-Since 标头。

于 2011-04-27T00:33:00.230 回答
1

我在 Safari 8.0 中遇到了这个问题。尽管向Last-ModifiedSafari 提供了标头,但它不会If-Modified-Since在后续请求中提供标头。在我的情况下,解决方法是另外将标题设置为与Expires标题相同的 html-date Last-Modified

以下是成功交换的示例:

初始请求

来自 Safari 的标准第一个请求。

GET http://localhost/image
Host: localhost
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

初步反应

我将 theExpiresLast-Modifiedheaders 都指定为相同的有效 html-date。我没有尝试过,但我怀疑 Safari 是否会尊重Expires设置为-1.

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Expires: Thu, 17 Jul 2014 19:50:58 GMT
Last-Modified: Thu, 17 Jul 2014 19:50:58 GMT
Content-Type: image/png
Content-Length: 1143902
Date: Wed, 22 Oct 2014 15:33:40 GMT

<<DATA>>

后续请求

最后 Safari 提供了所需的If-Modified-Since标头。

GET http://localhost/image
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-Modified-Since: Thu, 17 Jul 2014 19:50:58 GMT

后续响应

我可以满意地返回 304。

HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
Expires: Thu, 17 Jul 2014 19:50:58 GMT
Last-Modified: Thu, 17 Jul 2014 19:50:58 GMT
Date: Wed, 22 Oct 2014 15:33:43 GMT
于 2014-10-22T15:52:36.020 回答
0

Safari 只是部分免费软件。除了在 Apple 将整个 Safari 作为免费软件发布之前屏住呼吸,作为 Safari 用户,您可以使用缓存代理并将其配置为违反规范并忽略 Safari 发送的 Cache-Control 标头。

Squid 有r​​efresh_pattern指令,我相信其他代理也有类似的功能。

然后,您可以将 Safari 配置为使用代理,或者您可以本着upside-down-ternet的精神透明地执行此操作。

于 2014-04-24T15:59:32.810 回答
0

在我的测试中,Safari 期待“Expires”或“Cache-Control”标头以及“Last-Modified”。

Cache-Control: max-age=0, private
Last-Modified: Thu, 17 Aug 2018 12:04:23 GMT

或者,

Expires: Thu, 17 Aug 2018 12:04:23 GMT
Last-Modified: Thu, 17 Aug 2018 12:04:23 GMT

注意:Safari 需要“max-age”才能尊重“Last-Modified”

于 2017-08-17T22:05:19.583 回答