2

モバイル サイトの最初のページに HTTP Conditional Get 機能を追加しようとしています。しかし、私が見ているのは、Safari が読み込まれる最初のドキュメントに対して HTTP Conditional Get をサポートしていないということです。

これをテストするために、新しい Rails 3.2.13 アプリケーションを作成しました。1 つのアクションは次のようになります。

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 では、これは私の予想どおりに動作します。2 回目の読み込みで、ブラウザはリクエストで 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、画像など) に対して Conditional Get を明確にサポートしていることです。しかし、Safari に最初のドキュメントの Conditional Get リクエストを発行させる方法は、一生わかりません。

だから、私の質問は2つの部分だと思います:

  1. 明らかな何かが欠けていますか?Safari が設計上このように動作するというのは、実際には少しおかしなことに思えるからです。しかし、ここでAppleに期待しすぎたのかもしれません。

  2. 明らかな何かが欠けていない場合、回避策を知っている人はいますか?

4

0 に答える 0