首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Access-Control-Allow-Origin通配符子域、端口和协议

Access-Control-Allow-Origin通配符子域、端口和协议
EN

Stack Overflow用户
提问于 2012-12-22 21:44:27
回答 12查看 448K关注 0票数 388

我正在尝试为所有子域、端口和协议启用CORS。

例如,我希望能够运行从http://sub.mywebsite.com:8080/https://www.mywebsite.com/*的XHR请求。

通常,我希望启用来自源的请求匹配(且仅限于):

//*.mywebsite.com:*/*

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2015-01-17 02:09:55

基于DaveRandom的answer,我也尝试了一下,发现了一个稍微更简单的Apache解决方案,它产生了相同的结果(Access-Control-Allow-Origin动态设置为当前特定的协议+域+端口),而不使用任何重写规则:

代码语言:javascript
运行
复制
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$   CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"

就是这样。

那些想要在父域(例如mywebsite.com)及其所有子域上启用CORS的人可以简单地将第一行中的正则表达式替换为以下正则表达式:

^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$

注意:为了和正确的缓存行为,请始终为启用CORS的资源添加Vary: Origin响应头,即使是非CORS请求和来自不允许的源的请求也是如此(请参阅)。

票数 245
EN

Stack Overflow用户

发布于 2012-12-23 04:14:31

CORS规范要么全有要么全无。它只支持*null或确切的协议+域+端口:http://www.w3.org/TR/cors/#access-control-allow-origin-response-header

您的服务器将需要使用正则表达式验证原始头,然后您可以在Access-Control-Allow-Origin响应头中回显原始值。

票数 307
EN

Stack Overflow用户

发布于 2013-09-23 20:09:53

编辑:使用@Noyo's solution而不是这个。它更简单,更清晰,在负载下可能会有更好的性能。

此处留下的原始答案仅供历史使用!!

我在这个问题上做了一些尝试,并想出了这个可重用的.htaccess (或httpd.conf)解决方案,它可以与Apache一起使用:

代码语言:javascript
运行
复制
<IfModule mod_rewrite.c>
<IfModule mod_headers.c>
    # Define the root domain that is allowed
    SetEnvIf Origin .+ ACCESS_CONTROL_ROOT=yourdomain.com

    # Check that the Origin: matches the defined root domain and capture it in
    # an environment var if it does
    RewriteEngine On
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT} !=""
    RewriteCond %{ENV:ACCESS_CONTROL_ORIGIN} =""
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT}&%{HTTP:Origin} ^([^&]+)&(https?://(?:.+?\.)?\1(?::\d{1,5})?)$
    RewriteRule .* - [E=ACCESS_CONTROL_ORIGIN:%2]

    # Set the response header to the captured value if there was a match
    Header set Access-Control-Allow-Origin %{ACCESS_CONTROL_ORIGIN}e env=ACCESS_CONTROL_ORIGIN
</IfModule>
</IfModule>

只需将代码块顶部的ACCESS_CONTROL_ROOT变量设置为您的根域,如果Origin:请求标头值与您的域匹配,它将在Access-Control-Allow-Origin:响应标头值中将其返回给客户端。

还请注意,您可以使用sub.mydomain.com作为ACCESS_CONTROL_ROOT,它会将源限制为sub.mydomain.com*.sub.mydomain.com (即,它不必是域根)。允许变化的元素(协议、端口)可以通过修改正则表达式的URI匹配部分来控制。

票数 62
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14003332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档