带有 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.fr
和local2.something.fr
,类似于(伪代码)if (origin == "local.something.fr" or origin == "local2.something.fr") header "Access-Control-Allow-Origin" = origin
。真正需要的代码取决于实际的网络服务器软件是什么,以及它为有条件地设置标头提供了什么机制。以上是关于带有 Access-Control-Allow-Origin 正则表达式值的 ajax CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章