htaccess访问控制允许来源


134

我正在创建一个脚本,该脚本可以从外部加载到其他站点。它可以加载CSS和HTML,并且可以在我自己的服务器上正常工作。

但是,当我在另一个网站上尝试时,它显示此可怕的错误:

Access-Control-Allow-Origin

在这里,您可以看到它完美加载:http : //tzook.info/bot/

但是在另一个网站上却显示错误:http : //cantloseweight.co/robot/

我将加载脚本上传到jsfiddle:http : //jsfiddle.net/TL5LK/

我试图像这样编辑htaccess文件:

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

或像这样:

Header set Access-Control-Allow-Origin *

但这仍然行不通。

Answers:


268

在外部根文件夹的.htaccess中尝试以下操作:

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

如果仅涉及.js脚本,则应将以上代码包装在其中:

<FilesMatch "\.(js)$">
...
</FilesMatch>

6
关于使用的好建议FilesMatch
Nate 2014年

1
如果我们通过添加filesmatch块来匹配文件,那该*怎么办?
shenkwen

这样做后是否需要重新启动服务器?我申请上面的代码,但它仍然不会让我访问\上传.json,我换jsjson
shenkwen

3
@shenkwen *允许任何原始域访问此资源。它不是资源列表,而是引用域列表。
SparK's

3
如果它不工作,你应该尝试启用headers模块:a2enmod headers
华金Ø

53

没有人说您还必须启用mod_headers,因此,如果仍然无法正常工作,请尝试以下操作:

(以下技巧可在Ubuntu上使用,不了解其他发行版)

您可以使用以下命令检查已加载模块的列表

apache2ctl -M

启用您可以使用的mod_headers

a2enmod headers

当然,在对Apa​​che进行任何更改之后,您必须重新启动它:

/etc/init.d/apache2 restart

那你可以用

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

而且,如果mod_headers未处于活动状态,则此行将不执行任何操作。您可以尝试跳过if子句Header set Access-Control-Allow-Origin "*",然后仅在配置中添加,如果mod_headers未激活,则它在启动期间会引发错误。


3
一直在尝试我可以在Google上找到的所有选项,而且正如您所说,没有人对mod_headers发表任何评论。谢谢!
Sirkong'9

1
我的mod_headers处于活动状态,并在.htaccess中添加了此行(与提到的位置相同),但是仍然出现此错误:飞行前响应具有无效的HTTP状态代码400。
Sushivam

1
mod_headers是缺少的东西!这与.htaccess规则完美配合。谢谢。
安迪

@SachinS找不到400错误,500是服务器错误。从那里开始。
安迪

30

根据我的经验;

如果它从内部不起作用php.htaccess那么对我有用

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • 凭证可以为真,也可以为假,具体取决于您的ajax请求参数

这对我不起作用,但我能够使它在php中以相同的原理工作。
RevNoah

15

.htaccess如果在访问字体时遇到问题,请使用以下指令将文件添加到字体文件夹中。可以轻松修改以与.css.js文件一起使用。

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

1
请注意<FilesMatch>如果您的.htaccess文件位于fonts目录中, fonts目录中包含.eot,则上述指令是不必要的。ttf.otf和/或.woff文件。
Mesagoma '17

9

其他答案对我不起作用,这就是为apache2做花招的原因:

1)启用标头mod:

sudo a2enmod headers

2)创建/etc/apache2/mods-enabled/headers.conf文件并插入:

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

3)重新启动服务器:

sudo service apache2 restart


这是在我的Ubuntu 16.10服务器上唯一适用于我的解决方案。
kneeki's

这对我也有用。我正在使用Ubuntu 16.04服务器。谢谢。
jhedm

在Ubuntu 18.04上为我工作。但是,Firefox 70.0.1对仅Access-Control-Allow-Origin标头并不满意,我还必须添加一个Access-Control-Allow-Methods。
borizzzzz

@songololo我在Centos 7中找不到该文件用于apache。我在/ etc / httpd目录中到处都是。您能告诉我如何在Centos上实现它吗?
Mainuddin

@Mainuddin,对不起,我对Centos不熟悉。希望别人可以插入内容。
songololo

7

在Zend Framework 2.0中,我遇到了这个问题。可以通过两种方式解决.htaccess或php标头,我更喜欢.htaccess,因此我从以下方式修改了.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

它开始工作


这节省了我的一天,php couddnt工作,所以htaccess做到了。
Relm 2014年

4

顺便说一句:.htaccess配置必须在托管API的服务器上完成。例如,您在x.com域上创建了AngularJS应用程序,并在y.com上创建了Rest API,则应在y.com的根文件夹(而不是x)的.htaccess文件中设置Access-Control-Allow-Origin“ *” .com :)

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

同样如Lukas所述,如果使用Apache,请确保已启用mod_headers



0

如果您的主机不在pvn或专用服务器上,则很难重新启动服务器。

对于我来说,更好的解决方案是,只需编辑您的CSS文件(在另一个域或您的子域),即可将字体eot,woff等调用到您的来源(您的域或www yourdomain)。它会解决您的问题。

我的意思是,将CSS上的相对网址编辑为绝对网址来源域

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.