7

我有用户提交的文件,我试图以 10 MB 的块上传。我目前正在使用原始 XMLHttpRequest(和 XDomainRequest)将每个单独的切片(File.prototoype.slice)推送到前端。后端是使用上传模块的 Nginx 。

仅供参考,这里是我如何使用的概要slice

element.files[0].slice(...)

我了解跨浏览器前缀方法webkitSlice等等mozSlice

我遇到的问题是实际发出跨域请求。我正在从 上传server.localupload.server.local。在 Firefox 中,options请求通过正常,然后实际post失败。在 Chrome 和 Opera 中,options请求失败并显示

 OPTIONS https://URL Resource failed to load

以下是 Firefox 的标头:

请求标头

OPTIONS /path/to/asset HTTP/1.1
Host: upload.server.local:8443
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: https://server.local:8443
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-disposition,content-type,x-content-range,x-session-id
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

响应标头

HTTP/1.1 204 No Content
Server: nginx/1.2.6
Date: Wed, 13 Feb 2013 03:27:44 GMT
Connection: keep-alive
access-control-allow-origin: https://server.local:8443
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: x-content-range, origin, content-disposition, x-session-id, content-type, cache-control, pragma, referrer, host
access-control-allow-credentials: true
Access-Control-Max-Age: 10000

实际post请求永远不会离开浏览器。Nginx 访问日志永远不会看到post. 浏览器出于某种原因将其停止。我如何解开这篇文章被屏蔽的原因?

Chromium 24
Firefox 18
Opera 12.14

我已经在这里验证了所有浏览器都正确支持 CORS 。

通过将我的上传指向https://cors-test.appspot.com/test,我已经确认问题肯定出在服务器端标头上。

4

1 回答 1

1

如果预检检查没有返回足够的权限,则POST 不会离开浏览器,因此 POST 请求没有得到完全授权。问题中包含的请求/响应对我来说确实足够了。

  • 你确定你withCredentials = true在你的 XMLHttpRequest 中设置吗?
  • 您确定您的服务器上有有效的(非自签名的)SSL 证书吗?即使您添加了使用无效证书浏览站点的例外,HTTPS 也可能无法通过 CORS 检查。
  • 您是否尝试过清空缓存?您已Access-Control-Max-Age: 10000在响应标头中设置。也就是将近3个小时。我知道您在这方面工作的时间比这更长,但是在特别是测试时,将该标头设置为零,这样您就不会因为浏览器缓存旧访问权限而发疯。

一般来说,我会从尽可能宽松的 CORS 标头开始,然后慢慢提高安全性,看看它在哪里失败。然而,这并不完全简单。例如,根据关于 CORS 的 MDN 文档

响应凭据请求时,服务器必须指定域,并且不能使用通配符。如果标头被通配符为:上面的示例将失败:Access-Control-Allow-Origin: *

当我将您问题的请求部分发送到 时https://cors-test.appspot.com/test,我会收到以下信息:

HTTP/1.1 200 OK
Cache-Control: no-cache
Access-Control-Allow-Origin: https://server.local:8443
Access-Control-Allow-Headers: content-disposition,content-type,x-content-range,x-session-id
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 0
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 35
Vary: Accept-Encoding
Date: Thu, 23 May 2013 06:37:34 GMT
Server: Google Frontend

因此,您可以从那里开始并添加越来越多的安全性,直到它打破以找出罪魁祸首。

于 2013-05-15T05:59:34.333 回答