【发布时间】:2014-11-28 21:33:27
【问题描述】:
我了解 CORS 以及如何在服务器响应上设置适当的 Access-Control-* 标头。我发现的问题是,即使我的服务器以 Access-Control-Allow-Origin:* 响应,Chrome 也拒绝接受响应。
OPTIONS 请求:
OPTIONS /api/shows/1 HTTP/1.1
Host: *****
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Access-Control-Request-Headers: accept, platform, version
Accept: */*
Referer: http://local host:8888/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
回复:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Content-Type: */*
Content-Encoding: gzip
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Platform, Version
Access-Control-Allow-Methods: OPTIONS, TRACE, GET, HEAD, POST, PUT, DELETE
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 03 Oct 2014 19:07:28 GMT
在调试控制台中,Chrome 显示:
XMLHttpRequest 无法加载 http://****/api/shows/1。 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'localhost:8888'。
显然,响应中有 一个 Access-Control-Allow-Origin,但由于某种原因 Chrome 认为它无效?是否存在我无法在此响应中使用通配符的情况?
提前致谢!
【问题讨论】:
-
您的浏览器是否也在预检请求后发送实际请求?还是您的最终目标是真正读取 OPTIONS 响应(即,您的 Ajax 代码执行
xhr.open("OPTIONS", "/api/shows/1"))并且您认为这是实际请求? (即便如此,这仍然是一个预检,因为 OPTIONS 是一种非简单的 HTTP 方法,但这会让您更加困惑。) -
是的,浏览器跟随一个 GET 请求,但它被放弃了。谢谢你的想法。
-
只是为了 100% 清楚,“放弃”是指永远不会发送 GET 请求? (在 Chrome 网络检查器中它变成红色?)
-
是的,这就是我的意思。 GET 请求显示为红色,没有响应并显示“显示临时标头”消息
-
我能快速发现的唯一可能的问题是您的浏览器在
Access-Control-Request-Headers中将accept作为请求标头发送,但在Access-Control-Allow-Headers中是不允许的。我不确定为什么它甚至在那里,因为Accept是一个简单的请求标头,但这可能是导致拒绝的原因?
标签: javascript ajax cors access-control