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

服务器响应的东西看起来不错:

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 条目时阻止非显式网络请求很方便。
  • GET用方法替换POST方法:它有效,但我不喜欢它,因为它在语义上是错误的(我试图获取资源,而不是发布数据)。
  • GET用自定义但语义正确的方法替换该方法READ:它不起作用,但很有趣。

据我了解,我正在尝试做的事情属于W3C 规范中网络模型更改的第 3 步,并且应该按原样工作。

所以,毕竟,我的问题是:

  • 我究竟做错了什么 ?
  • 这是Firefox的错误吗?(我忘了告诉你,我的网站在 Chrome 和 IE10 中运行起来就像一个魅力(是的,IE10,就像 Microsoft Internet Explorer 版本 10)
  • 如果我必须做一个怪癖才能让它与 Firefox 一起工作,我应该做哪一个?有比我发现的两个坏的更好的解决方案吗?
4

3 回答 3

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 回答
1

尽管规范说缓存清单http://localhost:1337NETWORK部分应该足够了,但可能值得尝试完整的 URL ( http://localhost:1337/foo.bar) 以查看 Firefox 的实现中是否存在错误。

如果这不能解决问题并且所有其他方法都失败了,那么我只会*加入您的NETWORK部分,至少在您弄清楚导致问题的原因之前。对您的用户有用的代码比对您有用的代码更有价值。此外,还有其他方法可以在清单中查找丢失的条目。

于 2013-03-19T03:58:16.510 回答
1

Firefox 中存在一个开放缺陷(另请参见链接的副本),清单中引用的任何跨域资源在后续刷新时都会被阻止。除了投票和等待,此时您无能为力。

请注意,此问题应在 Firefox 33 及更高版本中得到解决。

于 2013-04-11T17:37:10.823 回答