4

私たちのサイトを HTML 5 フレンドリーにするプロジェクトに取り組んでいる間、クロス ドメイン リクエストの新しい方法を採用したいと考えていました (非表示の iframe を介して投稿する必要はもうありません!!!)。Access Control仕様を使用して、さまざまなブラウザーの動作を検証するためのいくつかのテストのセットアップを開始します。

現在の Rails RESTful アーキテクチャは、GET、POST、PUT、DELETE の 4 つの HTTP 動詞に依存しています。ただし、Access Control 仕様では、単純でないメソッド (PUT、DELETE) には HTTP 動詞 OPTIONS を使用したプリフライト リクエストが必要であると規定されています。さらに、テスト中に、Firefox 3.5.8 がプリフライト POST リクエストも同様に行うことを発見しました。

私の質問はこれです。Railsフレームワークが問題に対処するためのプロジェクトを知っている人はいますか? そうでない場合、すべての POST、PUT、DELETE メソッドのルートをサポートする必要があるため、OPTIONS メソッドをサポートするための最良の戦略について何か意見はありますか?

4

3 に答える 3

9

数日前に、ラック ミドルウェアを介して CORS サポートを実装する Gem をリリースしました。

http://github.com/cyu/rack-cors

プリフライト CORS リクエストに関しては、Chrome でプリフライト リクエストを動作させることができませんでした (単純な CORS リクエストで正常に動作します)。インターネットで検索すると、サポートされていない可能性があります。これについて Chrome フォーラムで質問しましたが、まだ回答がありません。

于 2010-06-09T03:56:20.033 に答える
3

これはSpinejsのドキュメントからのものです

CORsRailsの統合

リクエストの応答にリクエストアクセス制御ヘッダーの一部を追加するcorメソッドを作成しましょう。

app/application_controller.rbに以下を追加します。

before_filter :cor

def cor
  headers["Access-Control-Allow-Origin"]  = "js-app-origin.com"
  headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
  headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
  head(:ok) if request.request_method == "OPTIONS"
end

Access-Control-Allow-Originはワイルドカードを使用しますが、アプリをあらゆる種類のCSRF攻撃にさらす可能性があるため、使用しないことを強くお勧めします。ホワイトリストを使用する方がはるかに優れており、より安全です。

Access-Control-Allow-Headersセクション、特にX-Requested-Withヘッダーは重要です。Railsは、このヘッダーなしでAjaxリクエストを送信すると、それを嫌い、リクエストのAcceptヘッダーを無視して、実際にはJSONを返す必要があるときにHTMLを返します。

jQueryは、デフォルトではクロスドメインリクエストにこのヘッダーを追加しないことに注意してください。これはSpineが内部で解決する問題ですが、CORにプレーンなjQueryを使用している場合は、ヘッダーを手動で指定する必要があります。

jQuery.ajaxSetup({
  headers: {"X-Requested-With": "XMLHttpRequest"}
});

一部のブラウザは、正しいアクセスヘッダーが設定されていることを確認するために、最初にオプション要求をサーバーに送信します。Railsでこれをキャッチし、正しいヘッダーで200ステータスを返す必要があります。これを行うには、アプリケーションのconfig/routes.rbファイルに以下を追加します。

match '*all' => 'application#cor', :constraints => {:method => 'OPTIONS'}

これで、Spineを使用したクロスオリジンリクエストの準備が整いました。

于 2012-07-09T12:31:54.493 に答える
0

options メソッドをサポートするために Rails をハックしました。これをレールリストに投稿しましたが、リストを通過することはありませんでした。

GitHub Gist: Rails XHR2 / CORS / OPTIONS サポート

ctrl+f を押して #Options のある行を見つけます。変更したのはそれらだけです。

そして、これが実装例です| そしてもう一つ

于 2010-07-15T04:28:40.860 に答える