Access-Control-Allow-Origin不允许使用Rails 3和Angularjs Origin http:// localhost。

首先,我要说我已尝试过大量已在此处发布的解决方案。 它们似乎都不适合我。 我意识到我的问题源于CORS和我的rails应用程序无法正确处理。 但是,我不太清楚如何纠正这个问题。 我希望这里有人可以解释这个问题。

相关代码片段:

Rails application_controler.rb

class ApplicationController  '', :content_type => 'text/plain' end end def allow_cross_domain_access headers['Access-Control-Allow-Origin'] = '*'# http://localhost:9000 headers['Access-Control-Allow-Headers'] = 'GET, POST, PUT, DELETE, OPTIONS' headers['Access-Control-Allow-Methods'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',') headers['Access-Control-Max-Age'] = '1728000' end end 

Angular App.js

 ]).config(function($httpProvider){ delete $httpProvider.defaults.headers.common['X-Requested-With']; }); function loginCtrl ($scope,$http) { $scope.master = {}; $scope.isUnchanged = function(user) { return angular.equals(user, $scope.master); }; $scope.login = function (user) { $http({ method: 'POST', /*url: 'http://localhost/test/quote.php',*/ url: 'http://localhost:3000/api/sessions/', data: user }).success(function(data) { alert("call phonegap store data function:" + data.access_token) }).error(function (data, status, headers, config) { alert("error" ) }); }; 

}

来自chorme的错误消息

 OPTIONS http://localhost:3000/api/sessions/ 404 (Not Found) angular.js:6730 OPTIONS http://localhost:3000/api/sessions/ Origin http://localhost is not allowed by Access-Control-Allow-Origin. angular.js:6730 XMLHttpRequest cannot load http://localhost:3000/api/sessions/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

来自rails服务器的错误消息

 Started OPTIONS "/api/sessions/" for 127.0.0.1 at 2013-11-03 22:30:54 -0500 ActionController::RoutingError (uninitialized constant SessionsController): activesupport (3.2.13) lib/active_support/inflector/methods.rb:230:in `block in constantize' activesupport (3.2.13) lib/active_support/inflector/methods.rb:229:in `each' activesupport (3.2.13) lib/active_support/inflector/methods.rb:229:in `constantize' actionpack (3.2.13) lib/action_dispatch/routing/route_set.rb:69:in `controller _reference' ..... ....C:/Ruby/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service' C:/Ruby/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run' C:/Ruby/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread' Rendered C:/Ruby/lib/ruby/gems/2.0.0/gems/actionpack- 3.2.13/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.0ms) 

任何有关这方面的帮助将不胜感激!

我想到了。

  after_filter :cors_set_access_control_headers # For all responses in this controller, return the CORS access control headers. def cors_set_access_control_headers headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',') headers['Access-Control-Max-Age'] = "1728000" end 

我将上面的代码放在我的所有api控制器inheritance的基本控制器中。 问题是复制和粘贴解决方案。 ALLOW-headers和Allow-Methods值被反转。 修好了。

因此,如果我理解正确,您的rails应用程序正在localhost:3000上运行,提供角度应用程序,该应用程序又从localhost:80请求。 在这种情况下,您需要在localhost:80上Access-Control-Allow-Origin

我可以看到你找到了解决问题的方法,但我只是想指出你的allow_cross_domain_access方法中你的allow-headers和allow-methods也是混淆的。

你有:

 def allow_cross_domain_access headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Headers'] = 'GET, POST, PUT, DELETE, OPTIONS' headers['Access-Control-Allow-Methods'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',') headers['Access-Control-Max-Age'] = '1728000' end 

应该:

 def allow_cross_domain_access headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS' headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',') headers['Access-Control-Max-Age'] = '1728000' end 

希望有所帮助:)