2

我正在尝试将 HTTP 条件获取功能添加到移动网站的首页。但是,我所看到的让我认为 Safari 根本不支持它加载的第一个文档的 HTTP 条件获取。

我通过制作一个新的 Rails 3.2.13 应用程序对此进行了测试,其中一个操作如下所示:

def index
  last_modified = Date.today
  etag_obj = "something something"
  fresh_when last_modified: last_modified, etag: etag_obj, public: false
end

正如预期的那样,请求标头同时包含 Etag 和 Last-Modified:

[cache_test]$ curl -I http://localhost:5000/test
HTTP/1.1 200 OK 
Etag: "79b547467286b3e20fad13f73fc1bf78"
Last-Modified: Wed, 24 Apr 2013 00:00:00 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=0, private, must-revalidate
X-Ua-Compatible: IE=Edge
X-Request-Id: 8ace0b71533b2bc036bd84b12289cda6
X-Runtime: 0.012269
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Wed, 24 Apr 2013 21:06:49 GMT
Content-Length: 0
Connection: Keep-Alive
Set-Cookie: _cache_test_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTM0NWRjNDgyZGQwNWJmMGZkNmIzNmY4NjVmNWEzMDkwBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMTlYK0VrMERGdEsvOVlzbVJ5N1FPQlZXVDRwak9zQ3QzS3ZXZ1pvbnJocjg9BjsARg%3D%3D--0902ae8a505527bd49d969753ddf1d2bd4c716eb; path=/; HttpOnly

在 Firefox 20.0 和 Chrome 26.0.1410.65 上,这就像我预期的那样:在第二次加载时,浏览器在请求中发送 If-Modified-Since 和 If-None-Match,并收到 304 Not Modified。

但是,它并没有在 Safari 上执行此操作。在 Safari 上,它既不发送 If-Modified-Since 也不发送 If-None-Match,并且如您所料,它随后从服务器完全重新加载页面。我在我的 MacBook Pro 上的 Safari 6.0.3、使用 iOS 6.1 的 iPhone 的 iOS 模拟器中的 Safari 以及使用 iOS 6.1.3 的 iPad Mini 上看到了这一点。

真正奇怪的是,Safari 显然支持后续请求(CSS、JS、图像等)的条件获取——在主 HTML 页面通过后,我可以清楚地看到它们。但我一生无法弄清楚如何让 Safari 为第一个文档发出条件获取请求。

所以,我想我的问题是两个部分:

  1. 我错过了一些明显的东西吗?因为 Safari 设计的这种行为实际上看起来有点疯狂。但也许我在这里对苹果的期望太高了。

  2. 如果我没有遗漏一些明显的东西,有人知道任何解决方法吗?

4

0 回答 0