【问题标题】:CORS header ‘Access-Control-Allow-Origin’ does not match ‘(null)’, but it is not nullCORS 标头“Access-Control-Allow-Origin”与“(null)”不匹配,但不为 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”

标签: apache .htaccess cors cross-domain mod-headers


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2020-09-21
      • 2016-05-20
      • 2019-06-19
      • 2014-08-20
      • 2016-10-30
      相关资源
      最近更新 更多