.htaccess中的头设置Access-Control-Allow-Origin不起作用

时间:2012-05-17 17:33:17

标签: .htaccess mod-rewrite rewrite cors

我无法弄清楚为什么我的.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: *");

我缺少什么?

10 个答案:

答案 0 :(得分:127)

这应该有效:

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"

答案 1 :(得分:18)

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

我使用了标题检查器工具: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

使用此工具测试标题是否正常并对正在发生的事情进行排查。

答案 2 :(得分:10)

我在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
    });

请参阅此文章以供参考:

Header set Access-Control-Allow-Origin in .htaccess doesn't work

答案 3 :(得分: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"

此致

答案 4 :(得分:7)

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

答案 5 :(得分: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>

答案 6 :(得分:2)

I + 1&#39; d 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!)。

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

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

  

否&#39;访问控制 - 允许 - 来源&#39;标题出现在请求的上   资源。来源&#39; {mydomain} &#39;因此不允许访问。

我认为这必须是第一种。&#34; IE工作正常; Chrome,Firefox,Opera和Edge都是错误的; Chrome是最差。这与通常情况完全相反吗?

答案 7 :(得分:0)

花了半天没有工作。 虽然一切正常,但使用标头检查服务。 工作中的防火墙正在剥离它们

答案 8 :(得分: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>

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

答案 9 :(得分:0)

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