Firefox 不会发送跨域资源共享 Pre-flight?

Posted

技术标签:

【中文标题】Firefox 不会发送跨域资源共享 Pre-flight?【英文标题】:Firefox won't send Cross-Origin Resource Sharing Pre-flight? 【发布时间】:2012-06-30 14:16:30 【问题描述】:

我已经实现了一个利用 CORS 从另一台服务器收集 JSON 数据的 Web 应用程序。服务器在不同的子域上运行。 似乎一切都正确实施,并且与 Chromium 一起工作得很好。以下是我的请求副本,来自 Chromium。

我的问题是在 Firefox(使用 13.0.1 测试)中,从来没有对我的 AJAX 资源发出请求。没有发送预检请求,也没有发出实际请求。相反,我从 XMLHttpRequest.send() 函数中得到了这个错误:

[21:40:27.546] uncaught exception: [Exception... "Access to restricted URI denied"  code: "1012" nsresult: "0x805303f4 (NS_ERROR_DOM_BAD_URI)"  location: "http://192.168.1.99:2502/static/mootools-core-1.4.5.js Line: 5398"]

我正在使用 Mootools 的 Request.JSON 对象,它设置了各种额外的标头,这意味着确实需要预检。但是,它永远不会发送。

很遗憾,JSONP 不是一个选项,因为数据很敏感。

有没有人了解问题可能是什么? 非常感谢。


工作示例,来自 Chromium:

预检请求:

OPTIONS /api/resource HTTP/1.1
Host: dev0.mydomain.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://192.168.1.99:2502
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (Khtml, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19
Access-Control-Request-Headers: origin, x-request, x-requested-with, accept
Accept: */*
Referer: http://192.168.1.99:2502/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [redacted]

预检响应:

HTTP/1.0 200 OK
Server: PasteWSGIServer/0.5 Python/2.7.3
Date: Fri, 29 Jun 2012 01:43:37 GMT
Content-Length: 0
Access-Control-Allow-Headers: Cookie, Origin, X-Request, X-Requested-With, Accept
Access-Control-Max-Age: 1
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://192.168.1.99:2502
Access-Control-Allow-Methods: GET
Content-Type: text/html; charset=UTF-8

“真实”请求:

GET /api/resource HTTP/1.1
Host: dev0.mydomain.com
Connection: keep-alive
Origin: http://192.168.1.99:2502
X-Request: JSON
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19
Accept: application/json
Referer: http://192.168.1.99:2502/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [redacted]

“真实”响应:

HTTP/1.0 200 OK
Server: PasteWSGIServer/0.5 Python/2.7.3
Date: Fri, 29 Jun 2012 01:43:37 GMT
Access-Control-Allow-Origin: http://192.168.1.99:2502
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Access-Control-Allow-Credentials: true

【问题讨论】:

你的 mootools 中的那一行是 send() 调用吗?据我所知,从 Gecko 中的 send() 抛出异常的唯一方法是使用非 HTTP URI(您没有这样做)或直接在交叉中使用用户名或密码-站点 URI。如果你没有最后这样做,我不确定为什么这对你来说失败了。你不能把它放在公开的地方吗? 鲍里斯,你说得对,我现在觉得有点傻!事实上,我在我的 Mootools Request 对象中添加了一个用于 HTTP 身份验证的用户名,因为这是触发 Mootools 打开 XMLHttpRequest withCredentials 选项的最简单方法。 Chromium 没有发送用户名(大概是因为我没有包含密码),但 Firefox 显然确实考虑了它。现在的解决方案是扩展 Mootools 的 Request.JSON 对象以在没有 HTTP 身份验证用户名的情况下打开 withCredentials。谢谢! 【参考方案1】:

答案在问题的 cmets 中给出。由于我提供的 HTTP 身份验证用户名,Firefox 没有发送请求。

【讨论】:

以上是关于Firefox 不会发送跨域资源共享 Pre-flight?的主要内容,如果未能解决你的问题,请参考以下文章

Firefox CORS 跨域资源共享 飞行前调试

Amazon S3 CORS(跨域资源共享)和 Firefox 跨域字体加载

Amazon S3 CORS(跨源资源共享)和Firefox跨域字体加载

Firefox 跨域请求

如何修复 Firefox 中的跨域请求失败

跨域请求在 Firefox 中被阻止