iOS 6 の Safari は $.ajax の結果をキャッシュしますか? 質問する

iOS 6 の Safari は $.ajax の結果をキャッシュしますか? 質問する

iOS 6 へのアップグレード以降、Safari の Web ビューが$.ajax呼び出しをキャッシュするようになりました。これは PhoneGap アプリケーションのコンテキストで行われるため、Safari WebView を使用しています。呼び出しはメソッド$.ajaxでありPOST、キャッシュは false に設定されています{cache:false}が、それでもこの問題は発生します。ヘッダーに手動で を追加してみましたTimeStampが、効果はありませんでした。

さらに調査を進めたところ、Safari は、呼び出しごとに変化しない静的な関数シグネチャを持つ Web サービスに対してのみキャッシュされた結果を返すことがわかりました。たとえば、次のような関数を想像してください。

getNewRecordID(intRecordType)

この関数は同じ入力パラメータを何度も受け取りますが、返されるデータは毎回異なる必要があります。

Apple は iOS 6 を目覚ましく高速化しようと急いでいるため、キャッシュ設定に満足しすぎたに違いありません。iOS 6 でこの動作を見た人は他にいますか? もしそうなら、正確に何が原因でしょうか?


私たちが見つけた回避策は、関数シグネチャを次のように変更することでした。

getNewRecordID(intRecordType, strTimestamp)

そして、常にパラメータも渡しTimeStamp、サーバー側でその値を破棄します。これで問題は回避できます。

ベストアンサー1

少し調べてみると、iOS6 の Safari は、Cache-Control ヘッダーがないか、または「Cache-Control: max-age=0」である POST をキャッシュすることがわかりました。

サービス呼び出しの最後にランダムなクエリ文字列を追加するのではなく、グローバル レベルでこのキャッシュが行われないようにする唯一の方法は、「Cache-Control: no-cache」を設定することです。

それで:

  • Cache-ControlまたはExpiresヘッダーがない=iOS6 Safariはキャッシュする
  • Cache-Control max-age=0で即時Expires = iOS6 Safariはキャッシュします
  • Cache-Control: no-cache = iOS6 Safariはキャッシュしません

Apple は HTTP 仕様のセクション 9.5 の POST に関する部分からこれを利用しているのではないかと思います。

このメソッドへの応答は、応答に適切な Cache-Control または Expires ヘッダー フィールドが含まれていない限り、キャッシュできません。ただし、303 (See Other) 応答を使用して、ユーザー エージェントにキャッシュ可能なリソースを取得するように指示できます。

つまり、理論上は POST 応答をキャッシュできるということです... 誰が知っていたでしょう。しかし、他のブラウザ メーカーは、今までそれが良いアイデアだとは思っていませんでした。ただし、これは Cache-Control または Expires ヘッダーが設定されていない場合のキャッシュではなく、設定されている場合にのみキャッシュを考慮します。したがって、これはバグに違いありません。

以下は、私の API 全体を対象とするために Apache 構成の右側部分で使用しているものです。これは、実際には何もキャッシュしたくないため、get もキャッシュしたくないからです。私が知らないのは、これを POST のみに設定する方法です。

Header set Cache-Control "no-cache"

更新: POST が同じ場合のみであることを指摘していなかったことに気付きました。POST データまたは URL のいずれかを変更すれば問題ありません。他の場所で述べたように、URL にランダムなデータを追加するか、POST データを少し追加するだけで済みます。

更新: Apache では、必要に応じて次のように「no-cache」を POST のみに制限できます。

SetEnvIf Request_Method "POST" IS_POST
Header set Cache-Control "no-cache" env=IS_POST

おすすめ記事