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 预检无法返回标头

带有 PHP 标头的跨域请求标头 (CORS)

CORS 多个标头

未设置 CORS 标头

当请求标头具有 CloudFront + S3 网站的“接受编码”时,CORS 标头丢失

JQuery、CORS 和自定义响应标头