我在使用 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 一起工作,我应该做哪一个?有比我发现的两个坏的更好的解决方案吗?