CORSポリシーを通じてすべてを許可する


100

どうすればcorsを無効にできますか?何らかの理由で、許可されたオリジンとヘッダーをワイルドカード化しましたが、私のajaxリクエストは、オリジンが私の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をバイパスして情報を取得するにはどうすればよいですか?プリフライトチェックにはどのように対応すればよいですか?


1
「CORSを無効にする」ことはできませんが、実質的にポリシーはありませんか?リクエストに応じられないようです。
2013

1
これをlocalhostで使用しますか?
Dzung Nguyen 2013

回答:


154

rails-apiを使用したパブリックAPIにも同じ要件があります。

beforeフィルターにもヘッダーを設定しました。次のようになります。

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'

Access-Control-Request-Methodヘッダーを逃したようです。


それは奇妙です。発生したエラーの詳細を教えてください。
matteo 2013

github.com/cleor41/Cors-Rails4-APIまだどこに置くかわからない場合は、こちらをご覧ください。
CleoR 2014年

8
Access-Control-Request-Methodが応答ではなく要求に設定されています。developer.mozilla.org/en-US/docs/Web/HTTP/...
kuboon

19

見ていラックCORSのミドルウェアを。CORSヘッダーを構成可能な方法で処理します。


2
私たちは何ヶ月もラックコアを使用しており、これまでのところ問題はありませんでした。問題がクライアント側に存在しないことを確認しますか?
Jef

1
問題は、Chrome拡張機能がCORSをサポートしていないため、OriginがNullである可能性があることです。CORSを完全に無効にして、Nullオリジンのリクエストを含むすべてのリクエストに応答するにはどうすればよいですか?
2013

どのChrome拡張機能を使用していますか?
Jef 2013

1
Railsバックエンドと通信する必要があるChrome拡張機能を作成しています。
不適合者2013

12

単にあなたはrack-cors gem https://rubygems.org/gems/rack-cors/versions/0.4.0を追加でき ます

最初のステップ:Gemfileにgemを追加します。

gem 'rack-cors', :require => 'rack/cors'

保存して実行します bundle install

2番目のステップ:これを追加して、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 にアクセスしてください。レールを使用しない場合は特にそうです5。


私にとって.insert_before 0は重要でした。私が使用する前config.middleware.useは、自分のpublicディレクトリにCORSを許可するまでは機能していませんでした。
津波

5

特にChromeでも問題がありました。あなたがしたことは、本質的に私が私のアプリケーションでしたことのように見えます。唯一の違いは、ワイルドカードではなく、Origin CORSヘッダーの正しいホスト名で応答していることです。Chromeはこれにうるさいようです。

開発とプロダクションの切り替えが面倒なので、開発モードとプロダクションモードの両方で役立つこの小さな関数を書きました。以下のすべては、application_controller.rb特に明記しない限り私の中で起こります。それが最善の解決策ではないかもしれませんが、ラックコアも私にとっては機能しませんでした。理由を思い出せません。

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私のサイトにはログインが必要なので、私はこの小さなことを自分の中に持っています:

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

1
円を閉じるだけです。このCORS全体の混乱は、ローカルホストアプリケーションからプロダクションバックエンドにアクセスしたときにのみ発生します。すべてが本番環境にある場合、これは起こりませんか?
Sebastialonso

2
バックエンドとwebappが同じURLでホストされている場合のみ。それらが2つの異なるURLで完全にホストされている場合、これは本番環境でも発生します。
Christoph Eicke 14

3

以前に同様の問題がありましたが、問題であったのはWebブラウザー(私の場合はChrome)でした。

Chromeを使用している場合は、起動してみてください。

Windowsの場合:

1)デスクトップにChromeへのショートカットを作成します。ショートカットを右クリックして[プロパティ]を選択し、[ショートカット]タブに切り替えます。

2)「ターゲット」フィールドに、以下を追加します。–args –disable-web-security

Macの場合は、ターミナルウィンドウを開き、コマンドラインから次のコマンドを実行します:open〜/ Applications / Google \ Chrome.app/ –args –disable-web-security

上記の情報:

http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/


なぜこれは否決されたのですか?質問に記載されているのと同様の状況で、Webセキュリティを無効にしてchromeを実行することで解決しました。この問題は、開発サーバーをローカルで実行しているときに発生します。もちろん、Webセキュリティを常に無効にしてChromeを実行したままにすることはできません。
PropertyWebBuilder

彼は状況を正しく説明しているので、これは否決されるべきではありません:)
Dzung Nguyen 2013

4
私は投票をしませんでしたが、答えから、これが単に開発目的のための解決策であることは明らかではありません。これはローカルで問題を解決するかもしれませんが、Webビジター/拡張ユーザーがこれを行うことを期待することはできません。だから私は答えでそれを明確にするでしょう。
nathanvda 2013

1
ここでも投票はありませんでしたが、以前は、特定のフラグを使用してChromeの最初のインスタンスを実行すると、他のすべてのインスタンスが同じように実行されていました。なにか非常に警戒。忘れて簡単にサーフィンをするのは簡単すぎる。
dc5 2013

2

本番環境の私のRailsアプリケーションでこの問題が発生しました。ここで多くの回答がヒントを与えてくれて、ようやくうまくいく答えにたどり着くことができました。

私はNginxを実行していますが、my_app.confファイル(my_appはアプリ名です)を変更するだけで十分簡単です。このファイルは次の場所にあります/etc/nginx/conf.d

location / {}まだ追加していない場合は、単にに追加してserver {}から、に追加add_header 'Access-Control-Allow-Origin' '*';location / {}ます。

最終的な形式は次のようになります。

server {
    server_name ...;
    listen ...;
    root ...;

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
    }
}

-2

/config/application.rbで設定を試してください:

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

開発者がGemfileに「rack-cors」を追加する必要があることに言及するのを忘れていました
Gabriel Lidenor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.