web-dev-qa-db-ja.com

PhilSturgeonのCodeigniterRestserverとBackbone.jsでのHTTPOPTIONSエラー

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

私の調査に基づいて、私はこれから収集しました post that:

リクエストは常に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で を見つけました。少し時代遅れに見えるので、使うべきかどうかわかりません。

15
Joel Dean

私はまったく同じ問題に遭遇しました。これを解決するために、コアにMY_REST_Controller.phpがあり、すべてのREST APIコントローラーはそれを基本クラスとして使用します。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を返すだけで終了します。

42
jamespcole

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

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');
7
andymcintosh