htaccess中的Access-Control-Allow-Origin

时间:2016-06-10 18:30:13

标签: javascript php .htaccess cors

我有3个网站,A,B和C.

网站A有一个" test.js"我在网站B和C上调用的javascript文件.test.js文件使用XMLHttpRequest来获取单独的" stuff.html"站点A上的文件返回到主叫网站上的div。

为了在B和C站点上允许基于this answer on StackOverflow和其他几个站点的CORS,我将以下.htaccess放在A站点目录中:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(b.com|c.com)$" AccessControlAllowOrigin=$0
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header append Vary Origin
</IfModule>

当我尝试加载网站B时,它似乎有效。但是当我尝试在同一个浏览器中加载网站C时,我收到以下错误:

XMLHttpRequest cannot load http://www.a.com/stuff.html. The 'Access-Control-Allow-Origin' header has a value 'http://www.b.com' that is not equal to the supplied origin. Origin 'http://www.c.com' is therefore not allowed access.

那就是说,如果我清除缓存然后加载网站C,它就可以了。但是然后加载站点B不起作用,并给出相同的错误(反过来)。

有没有办法获得这个,以便它允许两个网站正确加载它?不知道我在这里可能缺少什么。

修改

经过一些测试后,我发现使用通配符可以解决问题:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin *
</IfModule>

...虽然我不确定这方面的安全性,因为它对所有人开放。假设stuff.html只是一个带有锚链接的静态html文件,而test.js唯一能做的就是将该文件的内容返回给客户的页面,有什么值得担心的吗? ?不确定是否可以利用任何恶意内容。

2 个答案:

答案 0 :(得分:1)

试试这个..

 <IfModule mod_headers.c> 
        SetEnvIf Origin "http(s)?://(www\.)?(b.com|c.com)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header append Vary Origin 
    </IfModule>

答案 1 :(得分:1)

如果有这个问题,这对我有用:

<?php
header("Access-Control-Allow-Origin: *");
?>

所以你必须将.html改为.php