【发布时间】:2013-07-16 12:47:17
【问题描述】:
从本地服务页面到远程服务器的 AJAX 请求失败,即使似乎所有 CORS 标头都存在。这是javascript:
$.ajax({url: 'http://prox.tum.lt/420663719182/test-upload?Action=SendMessage&Version=2012-11-05&MessageBody=eyJlbWFpbCI6IiIsInNhbHQiOiJ6eTVzbnV0ams5MWY5YTRpIn0%3D', headers: {"X-Endpoint": "http://sqs.us-east-1.amazonaws.com"}})
这是一个做同样事情的 curl 命令行:
curl -vH 'X-Endpoint: http://sqs.us-east-1.amazonaws.com' 'http://prox.tum.lt/420663719182/test-upload?Action=SendMessage&Version=2012-11-05&MessageBody=eyJlbWFpbCI6IiIsInNhbHQiOiJ6MTc3ZHk4cDUyaXlzeXZpIn0%3D'
如果你运行上面的命令,你可以看到响应 CORS 头是最大允许的:
< HTTP/1.1 200 OK
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Endpoint,Accept,Origin,Referer,X-Something
< Access-Control-Allow-Methods: GET, POST, OPTIONS
< Access-Control-Allow-Origin: *
以下是随请求一起发送的标头:
Request Headersview source
Accept: */*
Origin: http://localhost:3000
Referer: http://localhost:3000/upload
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36
X-Endpoint: http://sqs.us-east-1.amazonaws.com
但是,我仍然在 chrome 的网络控制台中看到请求失败:
XMLHttpRequest cannot load http://prox.tum.lt/420663719182/test-upload?Action=SendMessage&Version=2012-11-05&MessageBody=eyJlbWFpbCI6IiIsInNhbHQiOiJ6eTVzbnV0ams5MWY5YTRpIn0%3D. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
Access-Control-Allow-Origin: * 标头不应该让浏览器允许它通过吗?
我还在网络控制台中看到了一个预检请求,该请求似乎成功了 204,以及与上述相同的许可 CORS 标头。这是预检请求和响应标头的屏幕截图:
【问题讨论】:
-
您也可以显示请求标头吗?这些可能很重要,应该更能说明您的问题。
-
@RayNicholus 添加了请求标头。还添加了一条注释,我看到浏览器为此请求发出预检,这很奇怪,因为它是一个 GET 请求。但是,对预检的响应看起来应该允许 AJAX 请求。
-
有几个不同的因素用于确定用户代理是否应该预检请求。非标准标头的存在是一个因素。您的 X-Endpoint 标头正在触发预检。
-
@RayNicholus Ahhh,有趣,我不知道。直接从开发人员控制台复制/粘贴时,标头会出现问题,但这里有一个屏幕截图,显示了预检请求/响应中的所有标头。对我来说看起来不错,但我可能会遗漏一些东西。
-
@RayNicholus 我在 node.js 中重新实现了我的 CORS 服务器(它是一个复杂的 nginx 配置和 node.js 的组合),这个问题就消失了:P 因为我仍然没有知道出了什么问题,而且可能永远不会,我将删除这个问题。无论如何感谢您的帮助!
标签: javascript ajax cors