htaccess 中的访问控制允许来源
Posted
技术标签:
【中文标题】htaccess 中的访问控制允许来源【英文标题】:Access-Control-Allow-Origin in htaccess 【发布时间】:2016-10-11 19:43:40 【问题描述】:我有 3 个网站,A、B 和 C。
站点 A 有一个“test.js”javascript 文件,我在站点 B 和 C 上调用该文件。test.js 文件使用 XMLHttpRequest 来获取站点 A 上单独的“stuff.html”文件的内容以返回调用网站上的 div。
为了仅在 B 和 C 站点上允许 CORS,基于 this answer on *** 和其他几个站点,我将以下 .htaccess 放在 A 站点目录中:
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(b.com|c.com)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %AccessControlAllowOrigine 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 唯一要做的就是将该文件的内容返回到客户端的页面,有什么需要担心的吗?不确定这是否会被用于恶意攻击。
【问题讨论】:
【参考方案1】:试试这个..
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(b.com|c.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %AccessControlAllowOrigine env=AccessControlAllowOrigin
Header append Vary Origin
</IfModule>
【讨论】:
谢谢回复,可惜没用,还是和之前一样的错误。【参考方案2】:遇到这个问题,这对我有用:
<?php
header("Access-Control-Allow-Origin: *");
?>
所以你必须把 .html 改成 .php
【讨论】:
@VinodKumar 啊,不知道你可以这样限制域以上是关于htaccess 中的访问控制允许来源的主要内容,如果未能解决你的问题,请参考以下文章