带有 Access-Control-Allow-Origin 正则表达式值的 ajax CORS 问题

Posted

技术标签:

【中文标题】带有 Access-Control-Allow-Origin 正则表达式值的 ajax CORS 问题【英文标题】:ajax CORS issue of with a Access-Control-Allow-Origin regexp value 【发布时间】:2016-05-19 14:43:50 【问题描述】:

喂,

当我向另一个域执行 ajax 请求时出现此错误:

XMLHttpRequest cannot load http://rec.something.fr/services/data.
The 'Access-Control-Allow-Origin' header contains the invalid value '*.something.fr'.
Origin 'http://local.something.fr' is therefore not allowed access

我不明白“Access-Control-Allow-Origin”标头是否可以使用正则表达式。一些消息来源说可以,其他消息来源说不能。

最大的问题是,负责http://rec.something.fr 的是另一个社团。在我给他们打电话之前,我想确定问题出在他们的服务器上,而不是我的代码中缺少的东西。

我的代码:(Origin = http://local.something.fr)

$.ajax(
        url: "http://rec.something.fr/services/data",
        crossDomain: true,
        dataType: "json" )

调用的Services的内容是一个Json:

[data:myData]

如果我使用 CORS chrome 插件来捕获响应并替换 访问控制允许来源:*.something.fr 经过 Access-Control-Allow-Origin:*,它会工作。

我不能使用 JSONP,因为这需要更新 rec.something.fr 服务器

有什么想法吗?

【问题讨论】:

【参考方案1】:

Access-Control-Allow-Origin 值不能是正则表达式或任何其他类型的模式。它们必须与请求 Origin 标头完全匹配,或者是 null,或者是单个文字 *

另请参阅the accepted answer to the question Access-Control-Allow-Origin wildcard subdomains, ports and protocols 和问题Using a regular expression with CORS 的第一条评论。

因此,您无法自行解决此问题。 http://rec.something.fr 维护者只需要修复他们发送的损坏的 Access-Control-Allow-Origin 标头即可。

我不明白“Access-Control-Allow-Origin”标头是否可以使用 或不是正则表达式。一些消息来源说可以,其他消息来源说可以 不能。

绝对不能。 Access-Control-Allow-Origin 有效语法的当前权威来源是 “HTTP new-header syntax” section of the Fetch spec 中的 ABNF 产生式:

Access-Control-Allow-Origin      = origin-or-null / "*"

要获得良好的辅助来源,请参阅“Handling a simple request” section of the Using CORS article at html5 Rocks,它是这样说明的:

标头的值可以回显 Origin 请求标头,也可以是 '*' 以允许来自任何来源的请求。

因此,如果您想尝试帮助http://rec.something.fr 维护人员更正他们的服务器配置,您可以建议他们更改服务器逻辑中的代码以执行以下操作:

对于来自与 *.something.fr 匹配的来源的请求,将 Access-Control-Allow-Origin 发送回,其值与请求 Origin 标头的值完全相同 否则,对于来自与 *.something.fr 不匹配的来源的请求,则根本不发回 Access-Control-Allow-Origin

【讨论】:

非常感谢您,您知道我如何在不使用 * 的情况下允许两个不同的 Origin(local.something.fr 和 local2.something.fr')吗? 允许两个不同的来源local.something.frlocal2.something.fr,类似于(伪代码)if (origin == "local.something.fr" or origin == "local2.something.fr") header "Access-Control-Allow-Origin" = origin 。真正需要的代码取决于实际的网络服务器软件是什么,以及它为有条件地设置标头提供了什么机制。

以上是关于带有 Access-Control-Allow-Origin 正则表达式值的 ajax CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot跨域

SpringBoot跨域

SpringBoot跨域

如何通过CORS传递cookie?

node.js创建简单服务测试请求数据

利用Filter解决跨域请求的问题