2013-06-25 9 views
6

私は同じサーバー上に2つの別々のアプリ、emberアプリとrailsアプリを持っています。今、私はローカルでテストしています。Ember AppからRails Appへのリクエスト - クロスドメイン?

私のEmberリクエストはレールに出ていません(localhost:3000)。私はそれがクロスドメイン要求だと思っているので、それが起こっているかどうかわからない。同じサーバーに属していても、クロスドメイン要求とみなされますか?もしそうなら、セキュリティーを犠牲にすることなく同じサーバー上にあるので、このクロスドメイン要求を避けるためにとにかく存在しますか? JSONPに固執する必要がありますか?

答えて

7

はい、異なるポートへの要求はドメイン間の要求です。ブラウザはプリフライトOPTIONSリクエスト(CORS)を行っており、回答を得ていません。その後、元の要求を破棄します。このOPTIONS要求に対して、適切なCORSヘッダーでサーバーに応答させる必要があります。ブラウザは、その後、その信号を要求する。

ここはmore information on CORSです。

class V1::ApplicationController < ApplicationController 
after_filter :cors_set_access_control_headers, :log_user 

# respond to options requests with blank text/plain as per spec 
def cors_preflight_check 
    logger.info ">>> responding to CORS request" 
    render :text => '', :content_type => 'text/plain' 
end 

# 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-Headers'] = 'X-AUTH-TOKEN, X-API-VERSION, X-Requested-With, Content-Type, Accept, Origin' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

とルートから:ここで

は自分のアプリケーションのコントローラからのコードです。RB:

match '/*path' => 'application#cors_preflight_check', :via => :options 

これを扱うことができ、ラックのプラグインもあります:rack-cors

+1

私は 'rack-cors'を使用していますが、リクエストを実行しているときに、私のレールサーバに何も表示されません。クロスドメインリクエストはRailsサーバに表示された後、拒否されますか、またはAJAXは送信前にそれらを先に拒否しますか? – darksky

+0

'AJAX'がクロスドメインリクエストをブロックしてから送信する場合の' cors'のポイントは何ですか? – darksky

+0

AJAXはクロスドメインリクエストのためのフライト前のOPTIONSリクエストを常に送信します。一部のブラウザデバッグツールではこれを表示していません。 rak-corsを動作させることができなかったので、OPTIONSリクエストを自分で処理しました。 – buuda

0

あなたはあなたが実行しているものをプラットフォームと言ういけない、しかし、アイブ氏が見つからこの種のもののために最善の解決策は、テープ

https://github.com/metajack/tape

である。これは、あなたが少しリバースプロキシを設定することができます - とあなたのJSを提供している間、あなたのレールアプリにURLをマップしてください。

異なるポートは、セキュリティサンドボックスによって異なるドメインと見なされるため、エバーとレールを別々に提供する場合は、リバースプロキシが必要です。私はあなたがアプリの開発や生産モードで実行している場合によってはオプションのカップルを持っていると思います

+0

私のローカル環境は、OS Xであるが、私はLinux上で展開されます。私はそれを見てみましょう。あなたの質問に答えると、各アプリは別々に提供されます。 – darksky

0

、これは以下のとおりです。

開発モードのみ

  • あなたがようchromeまたはchromiumを使用している場合あなたの開発ブラウザは、あなたが旗でそれを始めることができました--args --disable-web-security

開発と生産モード

  • 使用jsonpすでに
  • を述べたように、あなたがレールを使用しているため、サーバー構成クロスオリジンリクエストヘッダにAccess-Control-Allow-Origin: *を追加見hereを持っています。
  • などhttp://myhost.com/app2、パスだけhttp://myhost.com/app1にvariing同じドメイン&ポートの下にアプリのサーブ

それがお役に立てば幸いです。

関連する問題