当我生成页面时,我发送标题
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
然后,当我再次尝试获取此页面时,所有浏览器都会发送正确的请求并获得除了Safari之外的304答案 - 它永远不会发送if-modified-since。它总是重新加载整个页面,即使它已被改变
Safari的这种行为是否已知,以及如何使Safari以正确的方式工作?
答案 0 :(得分:1)
Bart Lateur wrote a post关于这一点,有一段说明Safari:
Safari甚至更进一步:如果标题不是http标准格式的日期,则只删除标题。它根本不会在下一个请求中发送If- Modified-Since标头。
答案 1 :(得分:1)
我在Safari 8.0中遇到了这个问题。尽管向Safari提供了Last-Modified
标头,但它不会在后续请求中提供If-Modified-Since
标头。我的修复是另外将Expires
标题设置为与Last-Modified
标题相同的html日期。
以下是成功交换的示例:
初始请求
来自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
初步回复
我将Expires
和Last-Modified
标头指定为相同的有效html日期。我没有尝试,但我怀疑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
答案 2 :(得分:0)
Safari只有partly免费软件。除了屏住呼吸直到Apple将整个Safari作为免费软件发布之外,作为Safari用户,您可以使用缓存代理并对其进行配置以破坏规范并忽略Safari发送的Cache-Control标头。
Squid有refresh_pattern指令,我确信其他代理也有类似的功能。
然后,您可以将Safari配置为使用代理,或者您可以本着upside-down-ternet的精神透明地执行此操作。
答案 3 :(得分:0)
在我的测试中,Safari期待着&#34; Expires&#34;或者&#34; Cache-Control&#34;标题以及&#34; Last-Modified&#34;。
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
注意:&#34; max-age&#34; Safari必须遵守&#34; Last-Modified&#34;