如何使用通配符来允许特定域 CORS?

Posted

技术标签:

【中文标题】如何使用通配符来允许特定域 CORS?【英文标题】:How to use wildcards to allow specific domain CORS? 【发布时间】:2020-09-07 20:38:56 【问题描述】:

我想允许以allow_origin 的身份访问指定域,像这样

http://anystring.fixed-name.com

这里的 fixed-name.com 是固定域,但域的初始部分可以是任何东西,所以我需要允许 CORS 包括结尾的任何东西 (fixed-name.com)

所以我是这样尝试的

allow_origin: 'http://*.fixed-name.com'

假设http://testdomain-test.com 尝试从这个 URL 访问它,它仍然会抛出 CORS 错误。

【问题讨论】:

【参考方案1】:

既然你标记了这个symfony。

您可以直接使用NelmioCorsBundle 执行此操作。

只需安装软件包 (composer req cors),然后在您的配置中:

nelmio_cors:
    allow_origin: ['^https?://.+\.fixed-name.com$']

这将为来自fixed-name.com 子域的任何请求发出特定的 CORS 标头,但不会为任何其他请求发出 CORS 标头。

您可以有一个可能的来源数组,并且该数组的每个元素都可以是一个正则表达式,这样可以为您提供足够的灵活性来处理任何情况(另外,您可以轻松地为 prod 和 dev 使用不同的配置环境变量)。

【讨论】:

nelmio_cors:默认值:allow_credentials:假allow_origin:[]allow_headers:[]allow_methods:[]expose_headers:[] max_age:0 主机:[] origin_regex:假forced_allow_origin_value:〜路径:'^/api ': allow_credentials: true allow_origin: ['^http?://.+\.sam.code.com$'] allow_headers: ['*'] 所以我尝试使用 demo-sam.code.com 访问 api,但遇到了 CORS 问题 您的正则表达式似乎是错误的。如果您使用demo-sam.code 作为域,并且变量部分应该是demo-,那么适当的正则表达式将是:.+sam.code.com。您在我的示例中添加了一个句点 (.),但只有在您使用子域时才会出现。现在只需获得适当的正则表达式即可。该软件包有效,被成千上万的用户使用。 随心所欲地具体或不具体。如果你的域模式太不规则,你最终会匹配很多你不感兴趣的东西。例如。上面的你会匹配demo-sam.code.com,但你也会匹配anythingelsesam.code.com 如果它总是用破折号(-)在你的正则表达式中使用:'^https?://.+-sam.codecom$'【参考方案2】:

你不能。 CORS 通配符全有或全无。

相反,根据您的模式(例如使用正则表达式)测试 Origin 请求标头,然后在匹配时将值回显到 Access-Control-Allow-Origin 响应标头中。

【讨论】:

我尝试了 reg exp: allow_origin: ['^http?://*.+-sam.code.com$'] for origin demo-sam.code.com 。但它不工作给 cors 问题这有什么问题? @SunilRawat — 我想无论您使用哪个库读取该值,都不接受正则表达式。 感谢@Quentin,它现在可以工作了。我错过了为我的 resp api 包启用 reg 支持。

以上是关于如何使用通配符来允许特定域 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

API 网关 CORS 问题

如何修复“CORS 协议不允许同时指定通配符(任何)来源和凭据”错误

CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符

CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符

CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符

为啥我总是得到一个不允许通配符 * 的 cors 错误,尽管我在服务器上指定了一个来源?