CORS 标头“Access-Control-Allow-Origin”与“(null)”不匹配,但不为 null
Posted
技术标签:
【中文标题】CORS 标头“Access-Control-Allow-Origin”与“(null)”不匹配,但不为 null【英文标题】:CORS header ‘Access-Control-Allow-Origin’ does not match ‘(null)’, but it is not null 【发布时间】:2017-07-09 09:13:55 【问题描述】:我有一个简单的 AJAX 请求,调用 http://myexamplefeed.com/feed/23213
我刚把这个网站移到一个新的服务器上,突然间我收到了这个错误:
跨域请求被阻止:同源策略不允许读取 http://myexamplefeed.com/feed/23213 的远程资源。 (原因: CORS 标头“Access-Control-Allow-Origin”与“(null)”不匹配。
问题是,在我的 .htaccess 文件中,我尝试匹配 *:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin: *
</IfModule>
和http://myexamplefeed.com:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin: "http://myexamplefeed.com"
</IfModule>
我仍然收到CORS header ‘Access-Control-Allow-Origin’ does not match ‘(null)’
错误。
不是 null 指的是 Header set Access-Control-Allow-Origin
值,我不应该能够在我的 .htaccess 文件中更改它吗?
更新:那是在 Firefox 中。在 Chrome 中,我收到以下消息:
“Access-Control-Allow-Origin”标头包含多个值 '*, *',但只允许一个
【问题讨论】:
本指南可能会有所帮助。 enable-cors.org/server_apache.html 如果您检查响应标头,我想您可能会发现响应中发送了多个Access-Control-Allow-Origin
响应标头。您可以使用 curl 在浏览器外部进行测试,如下所示:curl -i -H "Origin: http://sitethiserrorisoccurringon.com" http://myexamplefeed.com/feed/23213
错误消息的不同只是因为 Chrome 在尝试使用之前对 Access-Control-Allow-Origin 标头值进行了验证检查,而 Firefox 目前没有进行任何此类检查但只是尝试对标头值进行文字匹配(如果它有多个标记,则永远不会匹配任何东西)。
@sideshowbarker 果然,两个“Access-Control-Allow-Origin: *”响应头。奇怪的是,这是在从 .htacess 中注释掉该行之后。此外,在 /etc/httpd/conf/httpd.conf 中没有任何迹象!
@sideshowbarker FWIW,重复的响应标头出现在这些标头之后:“X-Powered-By: php/5.4.16”和“X-Powered-By: PleskLin”
【参考方案1】:
尝试:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
【讨论】:
同样的错误。它必须与 Apache 的设置方式有关,因为这个 .htaccess 文件以前可以正常工作。嘘 请看我的更新。我在 Chrome 中遇到了另一个错误。【参考方案2】:很抱歉,不允许在 Access-Control-Allow-Origin 上使用多个值。您可以使用通配符“*”或使用单个域。
另一种方法是编写一个小脚本并根据请求的来源更改该值,并将其与可能的域列表进行比较。
【讨论】:
【参考方案3】:这有点晚了,但对于那些想要支持多个域的人来说,这可以通过一些额外的配置来实现。我不建议在少数域之外这样做。这将在 Apache 2.4+ 中工作
<IfModule mod_setenvif.c>
SetEnvIfExpr "(tolower(req('Origin')) == 'https://prod.someschool.edu')" isProd
SetEnvIfExpr "(tolower(req('Origin')) == 'https://dev.someschool.edu')" isDev
<IfModule mod_headers.c>
Header always set Access-Control-Allow-Origin "https://prod.someschool.edu" env=isProd
Header always set Access-Control-Allow-Origin "https://dev.someschool.edu" env=isDev
</IfModule>
</IfModule>
【讨论】:
以上是关于CORS 标头“Access-Control-Allow-Origin”与“(null)”不匹配,但不为 null的主要内容,如果未能解决你的问题,请参考以下文章
CORS - 从 Postman 伪造 CORS 预检无法返回标头