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 中的访问控制允许来源的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2,没有“访问控制允许来源”

Chrome 中的访问控制允许来源错误

Safari 中的访问控制允许来源

ASP 中的访问控制允许来源

Cors - Firebase 云功能中的访问控制允许来源错误

Angular 2 http服务中的访问控制允许来源问题