CORS 不适用于 Chrome/Firefox 和 Apache

Posted

技术标签:

【中文标题】CORS 不适用于 Chrome/Firefox 和 Apache【英文标题】:CORS not working on Chrome/Firefox and Apache 【发布时间】:2016-01-15 01:42:52 【问题描述】:

我正在尝试使用 CORS 在我的浏览器和 Apache 服务器(位于不同域中)之间运行 AJAX 请求。

在服务器端,我根据“Header set Access-Control-Allow-Origin in .htaccess doesn't work”中的响应在服务器的 httpd.conf 部分进行了以下更改:

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        :'https://x.x.x.x/validateCustomerID',
            type       : 'POST',
            cache    : false,
            crossDomain: true,
            contentType: 'application/json',
            beforeSend: function(xhr)
                    xhr.setRequestHeader("Access-Control-Allow-Methods","POST");
                    xhr.setRequestHeader("Access-Control-Allow-Headers","X-Requested-With");
                    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            ,
            data       : loginId : '12345',
            success    : function(response)console.log("Success"+JSON.stringify(response)),
            error      : function(response)console.log("Error"+JSON.stringify(response))
        );
    

我也尝试注释掉 beforeSend() 以避免预检请求,但它也没有成功。

我在 Chrome 和 Firefox 上收到的错误消息是:

在 Chrome 中:

“XMLHttpRequest 无法加载https://x.x.x.x/validateCustomerID。请求的资源上不存在'Access-Control-Allow-Origin'标头。因此不允许访问源'null'。响应的HTTP状态代码为403。”

在 Firefox 中:

“跨域请求被阻止:同源策略不允许读取位于https://x.x.x.x/validateCustomerID 的远程资源。(原因:CORS 请求失败)。”

在我的浏览器中没有从服务器接收到响应标头,我认为 CORS 工作是必需的,并且登录服务器显示没有从我的浏览器到达它的请求。

如果有人能帮我解决这个问题,我将不胜感激,因为我已经被困在这里好几天了,并且已经使用了几乎所有的命中和试验方法来使这件事发挥作用。

【问题讨论】:

你激活了apache模块头a2enmod headers吗? 为什么要在 request 中设置 Access-Control 标头? @Jacob,我尝试使用 a2enmod headers 命令激活 apache 模块头,但它给了我一个错误,它是一个无效的命令。然后我在某处读到,Apache 默认启用了 Mod_headers,所以我保持原样。会不会是个问题? @Quentin:我在建议尝试在请求本身中设置标头的地方读到它,所以我试了一下。就像我在问题本身中提到的那样,我已经坚持了几天了,并且一直在尝试我能找到的任何建议。但是后来我也尝试删除请求标头,但它仍然无法正常工作。有什么建议吗? 为了避免预检请求 - 你已经通过将内容类型设置为 application/json 来保证预检......如果预检正在杀死你,现在你知道为什么 【参考方案1】:

这是我在site.conf 中的设置,现在可以在生产环境中使用 apache2

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

为了将来的参考,我强烈建议将此站点添加为书签http://enable-cors.org/index.html

【讨论】:

我在设置 Apache 设置时实际上通过了相同的链接。但是,在我们需要执行“a2enmod headers”的最后一点,我收到一条错误消息,指出这是一个无效命令。我没有进一步尝试,因为它上面写着它在 Apache 中默认启用了 mod_headers。 您在问题中遇到的错误表明标头实际上并未添加到响应中,您是否重新启动了 apache?你在用 apache2 吗?

以上是关于CORS 不适用于 Chrome/Firefox 和 Apache的主要内容,如果未能解决你的问题,请参考以下文章

WebAPi - Firefox 和 chrome 中的 CORS

Google Charts 散点图适用于 Chrome Macbook,但不适用于 Chrome iPhone

为啥 CORS 似乎不适用于 POST?

CORS 不适用于 jQuery

Web Api 2 CORS 不适用于 POST

CORS 不适用于路由