尽管设置了标头,但不允许 CORS 请求

Posted

技术标签:

【中文标题】尽管设置了标头,但不允许 CORS 请求【英文标题】:CORS request isn't allowed despite headers being set 【发布时间】:2012-07-19 18:43:48 【问题描述】:

我在尝试执行 XHR 请求时收到以下错误。我已经设置了 CORS 响应标头,但显然出了点问题。谁能发现错误?

XMLHttpRequest 无法加载 http://domain.dev/path。 Access-Control-Allow-Origin 不允许来源http://mobile.dev。

预检请求标头 (OPTIONS)

这是一个飞行前请求,用于验证请求。

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-pre-process, x-requested-with, x-client, x-client-version, accept, x-session
Access-Control-Request-Method:GET
Cache-Control:max-age=0
Connection:keep-alive
Host:my-app.dev
Origin:http://mobile.dev
Pragma:no-cache
Referer:http://mobile.dev/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.2 (Khtml, like Gecko) Chrome/22.0.1211.0 Safari/537.2

响应标头

这是服务器对飞行前请求的响应。

Access-Control-Allow-Headers:origin, x-pre-process, x-requested-with, x-client, x-client-version, accept, x-session
Access-Control-Allow-Methods:GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Origin:http://mobile.dev
Access-Control-Max-Age:3600
Cache-Control:max-age=0, private, must-revalidate
Connection:close
Content-Type:text/html; charset=utf-8
ETag:"7215ee9c7d9dc229d2921a40e899ec5f"
X-Request-Id:3fca5f24077bcbd1351d552edf311f82
X-Runtime:0.014551

真实请求标头

这是真正的请求,由于上面引用的错误,被浏览器取消了。

Accept:application/json, text/javascript, */*; q=0.01
Cache-Control:no-cache
Origin:http://mobile.dev
Pragma:no-cache
Referer:http://mobile.dev/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1211.0 Safari/537.2
X-Client:mobile
X-Client-Version:1.6
X-Pre-Process:underscore
X-Requested-With:XMLHttpRequest
X-Session:j9y01yw33txmdbcz1ao258uy7bzjlm

【问题讨论】:

【参考方案1】:

似乎有必要正确处理飞行前的 OPTIONS 请求,但不足以使跨站点资源请求正常工作。

在 OPTIONS 请求返回满意的标头后,对同一 URL 的任何后续请求的所有响应也必须具有必要的“Access-Control-Allow-Origin”标头,否则浏览器会吞下它们,他们赢了' 甚至不会出现在调试器窗口中。

所以看起来浏览器因为 OPTIONS 响应中的一些问题而取消了请求,但实际上,浏览器正在查看来自真实请求的响应标头,然后拒绝它们。

(从我自己的类似问题 Access-Control-Allow-Origin header not working - What am I doing wrong? 复制的答案以防万一)

【讨论】:

以上是关于尽管设置了标头,但不允许 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

尽管设置了标头,但 CORS 不起作用

CORS XMLHttpRequest 不允许我设置标头

由于浏览器设置的标头,Safari 拒绝重定向 CORS 请求

尽管 Access-Control-Allow-Origin 设置为 express ,但请求标头字段 Authorization

使用cors包和设置Access-Control标头都没有运气

尽管配置了正确的 CORS 标头,但 301 响应“跨源请求被阻止”