如何使Safari发送if-modified-since标头?

时间:2011-04-11 01:41:18

标签: safari if-modified-since

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

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以正确的方式工作?

4 个答案:

答案 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

初步回复

我将ExpiresLast-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;