我在使用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步,并且应该按原样运行。
所以,在这之后,我的问题是:
答案 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'
});