AngularJS和rails cors标头不起作用

Posted

技术标签:

【中文标题】AngularJS和rails cors标头不起作用【英文标题】:AngularJS and rails cors headers not working 【发布时间】:2014-05-03 10:44:33 【问题描述】:

我正在尝试构建一个角度水疗中心,但在使用 cors 时遇到了问题。我的 api 在 rails 上运行。

GET 请求正常工作,但 POST、PUT、DELETE 不起作用。消息是:

XMLHttpRequest cannot load http://localhost:3001/api/resources. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8888' is therefore not allowed access.

在 Rails 中,我有一个带有以下代码的 before_filter:

headers['Access-Control-Allow-Origin'] = '*' 
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
headers['Access-Control-Request-Method'] = '*' 
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'

在路线中:

match '/*path' => 'sessions#home', :via => :options

在角度配置中我设置了这个:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

对此有什么想法吗?我在 Mac 上,本地主机顺便说一句

编辑

此消息显示在 chrome 网络选项卡的标题中:

CAUTION: provisional headers are shown

【问题讨论】:

您是否尝试过不止一种浏览器?不管你信不信,我在 chrome 中遇到过这个问题,但它在 Firefox 中运行良好。 您可以发布请求/响应详细信息吗? 添加了我认为重要的唯一内容。见帖子 【参考方案1】:

问题似乎与rails配置有关。

Here 声明:

...我们可能希望禁用对 API 的 CSRF 保护,因为它们通常被设计为无状态。也就是说,请求 API 客户端将为您处理会话,而不是 Rails....

虽然不是 Angular(我认为这个问题无关紧要),this repo(我最近准备的)可能对遇到这个问题的任何人都有帮助。它包含为使用 CORS 的 Rails SPA 准备骨架的分步指南。

【讨论】:

【参考方案2】:

有一些选项可以在 Chrome 中禁用网络安全以允许跨域请求,但这绝不是最好的方法。

在 Mac 上:

open -a Google\ Chrome --args --disable-web-security

或者在您的 ajax 调用中尝试使用 dataType: 'JSONP'

【讨论】:

以上是关于AngularJS和rails cors标头不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法在 AngularJS 中的请求中指定标头

rails-api 和 angularJs 中的 CORS

带有授权标头的 AngularJS CORS

带有 CORS 和自定义标头的 AngularJS

即使 CORS 不允许标头值,Angularjs 也会继续进行服务器调用

AngularJS 应用程序的 CORS GET 中未发送 HTTP 标头