7

でのXMLHttpRequestキャッシングは私が応答キャッシュ可能と最終変更ヘッダーを設定するAjaxリクエストを行います。私がAjaxリクエストを初めて作成したとき、私は200 OKになります。 2回目は304 Not Modifiedです。ハードリフレッシュおよびInternet Explorer/Firefoxの

Chrome(Ctrl + F5)でハードリフレッシュすると、200 OK - すばらしいです!

Internet Explorer/Firefoxでハードリフレッシュすると、304 Not Modifiedと表示されます。ただし、他のすべてのリソース(JS/CSS/HTML/PNG)は200 OKを返します。

理由は、これらのブラウザのハードリフレッシュに関係なく、XMLHttpRequestの「If-Not-Modified」ヘッダーが送信されるためです。私はスティーブ・スーダーズがそれを文書化すると信じている。here

私はETagを設定し、 "If-None-Match"のコンディションを無駄にしてみました(これはSteve Soudersのページのコメントに記載されています)。

誰も知恵の宝石を持っていますか?

おかげで、 ベン

更新

私は、 "変更した場合は-以来" に対する保存された最終更新日時をチェックすることができます。しかし、うまくいけば、この質問はヘッダーが間違って設定されていることを知っている他のSOユーザーにとって役に立ちます。

要求しながら2

更新を「変更した場合-ので」毎回ヘッダで送信されます。有効期限が設定されていないか、または将来の日付に設定されている場合、Internet Explorerは要求を出しません。役に立たない!

アップデートは3

これは、同様に、今、ライブのブログかもしれません。 Internet Explorerは、localhostのときに2番目のリクエストを作成することはありません。実際のIPを使用するか、ループバックが機能します。

+1

スクリプトsrcパス(src = 'myscript.js?q = 45920'など)で乱数またはdatetime値を使用して、各リクエストでファイル名を変更してキャッシュを防止しようとしましたか? –

+0

ハードリフレッシュから来ない限り、キャッシュしておきたい。したがって、ランダムなクエリ文字列パラメータを設定しても効果はありません。しかし、提案をありがとう! –

答えて

2

IE10より前では、IEは、ドキュメントの読み込みの一部として行われない要求に対してリフレッシュフラグ(http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspxを参照)を適用しません。

必要に応じて、キャッシュされたコピーが将来の要求を満たすのを防ぐために、ターゲットURLにナンスを含めるように調整できます。または、max-age = 0を送信すると、強制的に各再利用の前にリソースが条件付きで再検証されます。

ブラウザが寿命を指定していないキャッシュされたリソースを再利用する理由については、http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

+0

答えと記事をありがとう。それは混乱した、非標準化された領域です。マークアップリソースと同じ方法で、JS loadイベントから作成されたXHRを処理することが、うまくいくかもしれません。 –

0

私は一貫性の制御のためのすべての要求タイプのためのキャッシュ・ヘッダーを管理していた時に来たソリューションを参照してください。

私はXMLHttpRequestsと同じように標準要求を強制しました。これはIEに次のキャッシュポリシーを使用するように指示していました:Cache-Control:private、max-age = 0。

何らかの理由で、IEはさまざまな要求タイプのヘッダーを受け入れていませんでした。たとえば、標準の要求に対する私のキャッシュポリシーは、ブラウザとXMLHttpRequestsにデフォルト設定されていましたが、上記の制御ポリシーに設定されていました。しかし、/ urlのようなものをリクエストすると、リクエストが正常に取得されます。残念ながら、XMLHttpRequestとして/ urlに同じリクエストを行うと、getリクエストがキャッシュされ、XMLHttpRequestが同じURLに当たっていたため、サーバーにアクセスすることさえありませんでした。

キャッシュポリシーを強制的に適用するか、リクエストタイプに異なるアクセスポイント(uri)を使用していることを確認してください。私の解決策は前者でした。

関連する問題