Apache的Header头支持多个站点域名跨域资源访问的正则写法

  • A+
所属分类:Apache

较为安全的配置,应该是直接指定具体的域名。注意是Header add不是Header set,否则只有最后一行的配置生效

Header add Access-Control-Allow-Origin "http://www.b.com"
Header add Access-Control-Allow-Origin "http://www.c.com"

但是如果b.com域名下有多个子域名(如img.b.com,pay.b.com...),都需要跨域访问我们服务器的资源,就需要将它们全部都配置一遍,一旦有新增域名,也需要修改配置。所以最好是允许*.b.com可以访问资源。
一开始我以为只要将"http://www.b.com"换成"http://*.b.com"就可以解决问题了,可是发现根本不是这样的。这里使用通配符无法实现想要的效果,而是应该使用正则式!!!"http(s)?://(www\.)?(b\.com)$"

\s空白符,\S非空白符,所以[\s\S]是任意字符

最后提一下,由于这里使用到了Header模块,所以Apache版本需要在2.2或以上(现在大部分服务器的Apache应该都满足这个条件)。
如果上述配置后报错,则需要加载Header模块:LoadModule headers_module modules/mod_headers.so。
如果提示Header模块不存在,则要添加到服务器:a2enmod headers。
如果提示a2enmod命令找不到,那就安装这个命令吧。。。
虽然不同域名可以访问到资源,但是在同一个浏览器中,b.com访问后,c.com就不能访问了。这个跟浏览器的缓存机制有关,需要在Apache跨域配置中添加下面一行

Header append Vary Origin

这里有详细说明
所以最后的配置:(添加到httpd.conf中)

<Directory "/usr/local/允许跨域访问的资源目录"> 
SetEnvIf Origin "http(s)?://(\S*\.)?(a\.com|b\.net)$" AccessControlAllowOrigin=$0$1  
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin  
#Header set Access-Control-Allow-Methods "GET, POST"
Header append Vary Origin
</Directory>
  • 免费领红包
  • 支付宝红包扫一扫
  • weinxin
  • 免费提现
  • 支付宝全额提现
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: