Firefox上的HTML5缓存清单阻止了Cross Origin请求

时间:2013-03-14 19:23:01

标签: html5 firefox cors html5-appcache cache-manifest

我在使用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规范中Changes to the networking model的第3步,并且应该按原样运行。

所以,在这之后,我的问题是:

  • 我做错了什么?
  • 这是firefox的错误吗? (我忘记了,我的网站就像Chrome和IE10中的魅力一样(是的,IE10,就像Microsoft Internet Explorer版本10)
  • 如果我不得不做一个让它与Firefox一起工作的怪癖,我应该做哪一个?有没有比我发现的2个更糟糕的解决方案更好的解决方案?

3 个答案:

答案 0 :(得分:1)

虽然the spec表示缓存清单http://localhost:1337部分中的NETWORK已足够,但可能需要尝试完整的网址(http://localhost:1337/foo.bar)来查看是否Firefox的实现存在一个错误。

如果这不能解决问题,而其他所有方法都失败了,我会把*放在你的NETWORK部分,至少直到找出导致问题的原因为止。通过适合您的代码为您的用户提供的价值代码。此外,还有其他方法可以在清单中找到丢失的条目。

答案 1 :(得分:1)

open defect in Firefox(另请参阅linked duplicate)清单中引用的任何跨域资源在后续刷新时都会被阻止。除了投票和等待之外,你现在做的不多了。

请注意,此问题应解决in Firefox 33 onwards

答案 2 :(得分:1)

A List Apart中提到了这个问题:Application Cache is a Douchebag。见Gotcha#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'
});