【问题标题】:How to make Safari send if-modified-since header?如何让 Safari 发送 if-modified-since 标头?
【发布时间】:2011-04-11 01:41:18
【问题描述】:

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

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

【问题讨论】:

标签: safari if-modified-since


【解决方案1】:

Bart Lateur wrote a post 关于这一点,并附有一段关于 Safari 的说明:

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

【讨论】:

【解决方案2】:

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

以下是成功交换的示例:

初始请求

来自 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 是否会支持设置为 -1 的 Expires 标头。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      在我的测试中,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”

      【讨论】:

        猜你喜欢
        • 2012-11-27
        • 2018-10-23
        • 2012-11-01
        • 2018-01-27
        • 1970-01-01
        • 2010-09-06
        • 2012-04-19
        • 2016-12-10
        • 2016-04-02
        相关资源
        最近更新 更多