.htaccess中的标题集Access-Control-Allow-Origin不起作用


90

我不明白为什么我的.htaccess标题设置不起作用。

我的.htaccess文件内容:

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

但是,当我删除Header并将它们添加进来时,index.php一切正常。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

我想念什么?

Answers:


134

这应该工作:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
不要忘记激活apache模块头a2enmod headers
Lucas Serafim 2014年

1
它修复了:“ Access-Control-Allow-Methods不允许使用方法PUT”
Rahul Prasad 2014年

6
另外,Header set在这种情况下最好使用。如果更改了代码并且确实设置了标头,则让Apache执行a header add将发送双**标头。例如,这将破坏像Restangular这样的客户端。
朱利安(Julian)2015年

2
如果需要的话,请不要忘记Header add Access-Control-Allow-Credentials "true"
Marco Marsala

20

仅作记录,我遇到了完全相同的问题,没有一个答案起作用。

我使用了标头检查器工具:http : //www.webconfs.com/http-header-check.php

我正在用我的IP(http://192.0.2.1/upload)测试,返回的内容如下:

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

发生重定向,并且AJAX请求不接受/遵循重定向。

原来是域末尾http://192.0.2.1/upload /缺少的斜杠

最后,我再次使用斜线进行了测试,并将其显示在下面。在脚本中也添加了斜杠,现在可以使用了。

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

使用此工具可以测试标题是否良好以及对正在发生的情况进行故障排除。


5
我现在正在打开11个选项卡以尝试解决此问题。这个答案应该在更多的地方。
JDavis '16

对于我的,我需要删除结尾的斜杠。很高兴我找到了这个。当我刚花费数小时的时间对其进行故障排除时,它应该已经工作了几个小时。
gorelog

11

我在GoDaddy上有一个共享托管。我也需要这个问题的答案,在四处搜寻之后,我发现这是可能的。

我编写了一个.htaccess文件,并将其放在操作页面所在的文件夹中。这是.htaccess文件的内容:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

这是我的ajax电话:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

请参阅本文以供参考:

.htaccess中的标题集Access-Control-Allow-Origin不起作用


8

请注意以下几点:

 Header add Access-Control-Allow-Origin "*"

授予所有人访问权限绝对不是明智的。最好只允许列出已知信任的主机...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

问候,


3
这行不通。Access-Control-Allow-Origin不允许使用多个值。您需要根据原始请求标头的值动态设置标头。
昆汀

7

我激活了Apache模块头a2enmod头,此问题已解决。


日志中的错误尚不清楚为什么我所做的更改会失败,并且此答案大有帮助。sudo a2enmod headers然后重启就可以了!
cchana '18

3

在外部根文件夹的.htaccess中尝试此操作

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

请注意:标头添加Access-Control-Allow-Origin“ *”授予所有人访问权限根本不是明智的。我认为您应该使用:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

我+1 Miro的答案是指向标头检查器网站http://www.webconfs.com/http-header-check.php的链接。每次您使用它时,都会弹出一个令人讨厌的广告,但是,它对于验证Access-Control-Allow-Origin标头的存在非常有用。

我正在从网页上的javascript中读取.json文件。我发现将以下内容添加到我的.htaccess文件中可以解决在IE 11(版本11.447.14393.0)中查看我的网页时出现的问题:

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

我还将以下内容添加到/etc/httpd.conf(Apache的配置文件)中:

AllowOverride All

标头检查器站点验证了现在正在发送Access-Control-Allow-Origin标头(感谢Miro!)。

但是,即使没有 Access-Control-Allow-Origin标头,Firefox 50.0.2,Opera 41.0.2353.69和Edge 38.14393.0.0仍会以任何方式获取文件。(注意:他们可能正在检查IP地址,因为我使用的两个域都托管在同一服务器上的同一IPv4地址上。)

但是,Chrome 54.0.2840.99 m(64位)会忽略Access-Control-Allow-Origin标头,并且无论如何都会失败,错误地报告:

所请求的资源上没有“ Access-Control-Allow-Origin”标头。因此,不允许访问源' {mydomain} '。

我认为这必须是某种“第一”。IE浏览器工作正常;Chrome,Firefox,Opera和Edge都是越野车;Chrome是最差的。这与通常情况完全相反吗?


0

花了半天没有任何工作。使用标题检查服务,尽管一切正常。工作中的防火墙正在剥离它们


0

试试这个:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

最好允许列出已知信任主机。


0

如果其他人正在尝试此方法,则最受支持的答案应该起作用。但是,如果您遇到问题,则可能是浏览器已缓存请求。要确认,请附加查询字符串。

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.