2

Firefox とアプリケーション キャッシュでいくつかのクロスオリジン リクエストを実行する際に問題が発生しています。

XHR リクエストのエラー ハンドラが呼び出され、XHR リクエストのステータスは 0 です。

firebug でネットワーク ログを見ると、問題ないように見える OPTIONS リクエストが表示されます。

OPTIONS /foo.bar HTTP/1.1
Host: localhost:1337
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://localhost:8080
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive

サーバーが OK に見える何かを応答する:

HTTP/1.1 200 OK
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Methods: GET, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: content-type
Date: Thu, 14 Mar 2013 17:55:22 GMT
Connection: keep-alive
Transfer-Encoding: chunked

次に、GET 自体が応答を取得しません。

GET /foo.bar HTTP/1.1
Host: localhost:1337
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://localhost:8080
Connection: keep-alive

(サーバーログを見ると、サーバーはリクエストを受け取りません)

私は html5 アプリケーション キャッシュ メカニズムを使用しています。これが私のマニフェストのネットワーク セクションです。

NETWORK:
default.php
resource.php
http://localhost:1337/

これが私が試したものです:

  • マニフェスト ファイル内の置き換え: 動作http://localhost:1337/*ますが、私はそれが好きではありません。不足している CACHE エントリの検出に関しては、非明示的なネットワーク リクエストをブロックすると便利であることがわかりました。
  • GETmethod を method に置き換えますPOST: 動作しますが、意味的に間違っているので好きではありません (データを投稿するのではなく、リソースを取得しようとしています)。
  • GETメソッドをカスタムだが意味論的に正しいメソッドに置き換えREADます。機能しませんが、楽しかったです。

私がやろうとしていることは、W3C の仕様のネットワーク モデルへの変更のステップ 3 に該当し、そのまま機能するはずであると理解しています。

したがって、このすべての後、私の質問は次のとおりです。

  • 私は何を間違っていますか?
  • これは firefox のバグですか? (言い忘れていましたが、私のサイトは Chrome と IE10 (はい、IE10、Microsoft Internet Explorer バージョン 10 のように) で魅力的に動作します)
  • Firefox で動作させるためにちょっとした工夫が必要だとしたら、どれをやればいいですか? 私が見つけた2つの悪い解決策よりも良い解決策はありますか?
4

3 に答える 3

1

仕様では、キャッシュマニフェストhttp://localhost:1337NETWORKセクションで十分であると記載されていますが、Firefoxの実装にバグがあるかどうかを確認するために完全なURL()を試す価値があるかもしれませんhttp://localhost:1337/foo.bar

それでもうまくいかず、他のすべてが失敗した場合は、少なくとも問題の原因がわかるまで、セクション*を挿入するだけです。NETWORKあなたのために働くコードよりもあなたのユーザーのために働く価値コード。さらに、マニフェストで欠落しているエントリを見つける方法は他にもあります。

于 2013-03-19T03:58:16.510 に答える
1

Firefoxには、マニフェストで参照されているクロスドメイン リソースが後続の更新でブロックされるというオープンな欠陥があります (リンクされた複製も参照)。この時点で、投票して待つ以外にできることはあまりありません。

この問題はFirefox 33 以降で解決されるはずです。

于 2013-04-11T17:37:10.823 に答える
1

その問題は A List Apart: Application Cache is a Douchebagで言及されました。落とし穴 #9 を参照してください。

各応答をリッスンしてから、自分で応答またはエラーをフィルタリングする必要があります。

$.ajax( url ).always( function(response) {
  // Exit if this request was deliberately aborted
  if (response.statusText === 'abort') { return; } // Does this smell like an error?
  if (response.responseText !== undefined) {
    if (response.responseText && response.status < 400) {
      // Not a real error, recover the content    resp
    } else {
      // This is a proper error, deal with it
      return;
    }
  }
  // do something with 'response'
});
于 2013-12-12T14:23:38.733 に答える