【问题标题】:Header set Access-Control-Allow-Origin in .htaccess doesn't work.htaccess 中的标头集 Access-Control-Allow-Origin 不起作用
【发布时间】:2012-05-25 07:37:27
【问题描述】:

我不明白为什么我的 .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: *");

我错过了什么?

【问题讨论】:

    标签: .htaccess mod-rewrite rewrite cors


    【解决方案1】:

    这应该可行:

    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"
    

    【讨论】:

    • 别忘了激活apache模块头a2enmod headers
    • 修复:“Access-Control-Allow-Methods 不允许方法 PUT”
    • 另外,在这种情况下最好使用Header set。如果代码更改并且确实设置了标头,则让 Apache 执行 header add 将发送双 ** 标头。例如,这会破坏像 Restangular 这样的客户端。
    • 如果需要,不要忘记Header add Access-Control-Allow-Credentials "true"
    【解决方案2】:

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

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

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

    【讨论】:

    • 我现在打开了 11 个标签,试图解决这个问题。这个答案应该在更多地方。
    • 对于我的,我需要删除尾部斜杠。很高兴我找到了这个。我花了很多时间来解决这个问题,当我新它应该在几个小时前工作时。
    【解决方案3】:

    我在 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

    【讨论】:

      【解决方案4】:

      注意:

       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"
      

      问候,

      【讨论】:

      • 这行不通。 Access-Control-Allow-Origin 不允许有多个值。您需要根据 Origin 请求标头的值动态设置标头。
      【解决方案5】:

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

      【讨论】:

      • 日志中的错误并不清楚为什么我所做的更改会失败,这个答案有很大帮助。 sudo a2enmod headers 并重新启动让它工作!
      【解决方案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>
      

      【讨论】:

        【解决方案7】:

        我为 Miro 的标题检查器站点 http://www.webconfs.com/http-header-check.php 的链接的答案 +1。每次使用时它都会弹出一个令人讨厌的广告,但它对于验证 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 是最差的。这不是和通常的情况完全相反吗?

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            试试这个:

            <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>
            
            

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 2013-10-27
                • 2011-09-13
                • 2014-03-04
                • 2015-05-02
                • 1970-01-01
                • 2016-01-11
                • 2017-01-13
                • 2020-09-21
                • 2019-06-19
                相关资源
                最近更新 更多