通过CORS政策允许任何事情
我怎样才能禁用Cors? 出于某种原因,我狂放梳理允许的来源和标题,但我的阿贾克斯请求仍然抱怨,我的CORS政策不允许的起源….
我的应用控制器:
class ApplicationController < ActionController::Base protect_from_forgery before_filter :current_user, :cors_preflight_check 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'] = '*' headers['Access-Control-Max-Age'] = "1728000" end # If this is a preflight OPTIONS request, then short-circuit the # request, return only the necessary headers and return an empty # text/plain. def cors_preflight_check if request.method == :options headers['Access-Control-Allow-Origin'] = '*' headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' headers['Access-Control-Allow-Headers'] = '*' headers['Access-Control-Max-Age'] = '1728000' render :text => '', :content_type => 'text/plain' end end private # get the user currently logged in def current_user @current_user ||= User.find(session[:user_id]) if session[:user_id] end helper_method :current_user end
路线:
match "*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" } match "/alert" => "alerts#create" match "/alerts" => "alerts#get" match "/login" => "sessions#create" match "/logout" => "sessions#destroy" match "/register" => "users#create"
编辑 – –
我也试过:
config.middleware.use Rack::Cors do allow do origins '*' resource '*', :headers => :any, :methods => [:get, :post, :delete, :put, :options] end end
在application.rb中
– 编辑2 —
问题是Chrome扩展可能不支持我认为的CORS。 我如何获取绕过CORS的信息? 我应该如何回应预检检查?
我对你使用rails-api的公共API有相同的要求。
我也在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'
看起来你错过了访问控制请求方法头。
看看机架中间件。 它将以可configuration的方式处理CORS头文件。
我曾经遇到类似的问题,事实certificate,在这个问题上,networking浏览器(我的情况是Chrome)
如果您使用的是chrome,请尝试启动它:
对于Windows:
1)在桌面上创build一个Chrome的快捷方式。 右键单击快捷方式并select“属性”,然后切换到“快捷方式”选项卡。
2)在“目标”字段中,附加以下内容:-args -disable-web-security
对于Mac,打开一个terminal窗口并从命令行运行:open〜/ Applications / Google \ Chrome.app / -args -disable-web-security
以上信息来自:
我遇到了问题,尤其是在Chrome上。 你所做的基本上和我在应用程序中所做的一样。 唯一的区别是,我在Origin CORS头文件中使用了正确的主机名,而不是通配符。 在我看来,铬是挑剔的。
在开发和生产之间切换是一个痛苦,所以我写了这个小函数,这有助于我在开发模式和生产模式。 以下所有的事情都发生在我的application_controller.rb
除非另有说明,它可能不是最好的解决scheme,但是rack-cors也不适合我,我不记得为什么。
def add_cors_headers origin = request.headers["Origin"] unless (not origin.nil?) and (origin == "http://localhost" or origin.starts_with? "http://localhost:") origin = "https://your.production-site.org" end headers['Access-Control-Allow-Origin'] = origin headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT, DELETE' allow_headers = request.headers["Access-Control-Request-Headers"] if allow_headers.nil? #shouldn't happen, but better be safe allow_headers = 'Origin, Authorization, Accept, Content-Type' end headers['Access-Control-Allow-Headers'] = allow_headers headers['Access-Control-Allow-Credentials'] = 'true' headers['Access-Control-Max-Age'] = '1728000' end
然后我在我的application_controller.rb
有这个小东西,因为我的站点需要login:
before_filter :add_cors_headers before_filter {authenticate_user! unless request.method == "OPTIONS"}
在我的routes.rb
我也有这个东西:
match '*path', :controller => 'application', :action => 'empty', :constraints => {:method => "OPTIONS"}
这个方法看起来像这样:
def empty render :nothing => true end
只要你可以添加机架gemhttps://rubygems.org/gems/rack-cors/versions/0.4.0
第一步:将gem添加到您的Gemfile中:
gem 'rack-cors', :require => 'rack/cors'
然后保存并运行bundle install
第二步:通过添加这个来更新你的config / application.rb文件:
config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', :headers => :any, :methods => [:get, :post, :options] end end
更多的细节你可以去https://github.com/cyu/rack-cors特别是如果你不使用rails 5。
尝试/config/application.rbconfiguration:
config.middleware.insert_before 0, "Rack::Cors" do allow do origins '*' resource '*', :headers => :any, :methods => [:get, :post, :options, :delete, :put, :patch], credentials: true end end
这也支持大多数PHP框架
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Credentials true Header set Access-Control-Allow-Headers "accept, content-type, X-Requested-With, X-Prototype-Version, X-CSRF-Token, authorization"
只要确保你评论… Origind行在httpd.conf文件中
# Virtual hosts #Header always set Access-Control-Allow-Origin "*" Include /private/etc/apache2/extra/httpd-vhosts.conf
或者你最终会有多个来源“*,*”的问题