93

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

我错过了什么?

4

10 回答 10

136

这应该有效:

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"
于 2012-07-27T16:19:45.147 回答
22

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

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

使用此工具测试您的标头是否良好并排除正在发生的问题。

于 2015-01-10T04:36:25.240 回答
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 不起作用

于 2013-05-02T15:54:21.237 回答
9

小心:

 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"

问候,

于 2016-10-07T08:55:24.590 回答
7

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

于 2015-12-10T04:32:49.287 回答
6

在外部根文件夹的 .htaccess 中试试这个

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

这样做时要小心Header add Access-Control-Allow-Origin "*"授予所有人访问权限根本不明智。我认为你应该用户:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>
于 2016-11-03T08:18:08.103 回答
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!)。

但是,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 标头并且无论如何都会失败,错误地报告:

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ {mydomain} ”。

我认为这必须是某种“第一”。IE 工作正常;Chrome、Firefox、Opera 和 Edge 都有 bug;而 Chrome 是最差的。这不是与通常情况完全相反吗?

于 2016-12-14T00:32:01.650 回答
0

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

于 2016-04-06T17:56:21.067 回答
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>

最好允许一个已知受信任主机的列表。

于 2019-04-10T05:18:57.010 回答
0

如果其他人正在尝试这个,那么最受好评的答案应该有效。但是,如果您遇到问题,则可能是浏览器缓存了请求。确认附加查询字符串。

于 2019-09-26T18:44:45.227 回答