18

別のホスト/URLにあるRESTfulWebbackbone.jsサービスにモデルを保存しようとすると、アプリケーションがHTTP OPTIONSnotfoundエラーをスローします。

私の調査に基づいて、私はこの投稿から次のことを収集しました:

リクエストは常にOPTIONShttpリクエストヘッダーを送信し、POSTリクエストをまったくトリガーしません。

明らかに、「ユーザーデータに副作用を引き起こす」リクエストを含むCORSは、目的のHTTPリクエストメソッドを実際に送信する前に、ブラウザにOPTIONSリクエストヘッダーを使用してリクエストを「プリフライト」させ、承認を確認します。

私はこれを回避しようとしました:

  • バックボーンのemulateHTTPをtrueに設定します。

Backbone.emulateHTTP = true;

  • また、ヘッダーですべてのCORSおよびCSRFオプションを許可しました。

    header('Access-Control-Allow-Origin:*');
    header( "Access-Control-Allow-Headers:Origin、X-Requested-With、Content-Type、Accept"); header( "Access-Control-Allow-Methods:GET、POST、OPTIONS");

Backbone.emulateHTTPコード行が導入されたときにアプリケーションがクラッシュしました。

CodeIgniter RESTServerでOPTIONSリクエストに応答する方法はありますか?また、このリクエストの会話を無効にする他の方法はありますか?


私はこれを1つの解決策としてGithubで見つけました。少し時代遅れのようですので、使うべきかわかりません。

4

2 に答える 2

49

私はまったく同じ問題に遭遇しました。これを解決するために、コアにMY_REST_Controller.phpがあり、すべてのRESTAPIコントローラーがそれを基本クラスとして使用しています。OPTIONSリクエストを処理するために、このようなコンストラクターを追加しただけです。

function __construct() {

    header('Access-Control-Allow-Origin: *');
    header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
    $method = $_SERVER['REQUEST_METHOD'];
    if($method == "OPTIONS") {
        die();
    }
    parent::__construct();
}

これは、リクエストタイプがOPTIONSであるかどうかをチェックし、そうであれば、リクエストのコード200を返すだけで終了します。

于 2013-10-11T04:28:06.923 に答える
7

サブクラスのプロパティを変更して$allowed_http_methods、optionsメソッドを除外することもできます。以前のバージョンのREST_controllerはOPTIONSで何もしませんでした。この行を追加すると、その動作を模倣しているようです。

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');
于 2013-12-11T05:25:57.523 に答える