Apache 跨域配置,apache跨域


    最近项目中需要实现跨域访问资源,本来是挺简单的一个配置,但是没有找到适合的答案。这个寻找答案的过程,对于一名终端的开发者来说,是曲折的。。。


    关于跨域(CORS),这篇文章有介绍,而且也提供了跨域的解决方案。不过文中使用到的配置,会让所有其他域名的网站都能够访问我们服务器的资源,存在一定的安全隐患。

Header set Access-Control-Allow-Origin * 

    

    较为安全的配置,应该是直接指定具体的域名。注意是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)$"

    所以最后的配置:(添加到httpd.conf中)

<Directory "/usr/local/允许跨域访问的资源目录">
SetEnvIf Origin "http(s)?://(www\.)?(b\.com|c\.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Methods "GET, POST"
</Directory>

    最后提一下,由于这里使用到了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


这里有详细说明




相关内容

    暂无相关文章