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