【问题标题】:CORS not working on Chrome/Firefox and ApacheCORS 不适用于 Chrome/Firefox 和 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 来保证预检......如果预检正在杀死你,现在你知道为什么

标签: javascript ajax apache google-chrome cors


【解决方案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 吗?
猜你喜欢
  • 2014-11-19
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2012-01-27
  • 2012-02-14
相关资源
最近更新 更多