我正在尝试为所有子域、端口和协议启用CORS。
例如,我希望能够运行从http://sub.mywebsite.com:8080/到https://www.mywebsite.com/*的XHR请求。
通常,我希望启用来自源的请求匹配(且仅限于):
//*.mywebsite.com:*/*
发布于 2015-01-17 02:09:55
基于DaveRandom的answer,我也尝试了一下,发现了一个稍微更简单的Apache解决方案,它产生了相同的结果(Access-Control-Allow-Origin
动态设置为当前特定的协议+域+端口),而不使用任何重写规则:
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请求和来自不允许的源的请求也是如此(请参阅)。
发布于 2012-12-23 04:14:31
CORS规范要么全有要么全无。它只支持*
、null
或确切的协议+域+端口:http://www.w3.org/TR/cors/#access-control-allow-origin-response-header
您的服务器将需要使用正则表达式验证原始头,然后您可以在Access-Control-Allow-Origin
响应头中回显原始值。
发布于 2013-09-23 20:09:53
编辑:使用@Noyo's solution而不是这个。它更简单,更清晰,在负载下可能会有更好的性能。
此处留下的原始答案仅供历史使用!!
我在这个问题上做了一些尝试,并想出了这个可重用的.htaccess (或httpd.conf)解决方案,它可以与Apache一起使用:
<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匹配部分来控制。
https://stackoverflow.com/questions/14003332
复制相似问题