10

backbone.js別のホスト/ URLにある安らかなWebサービスにモデルを保存しようとすると、HTTP OPTIONSが見つかりませんでした。Phil SturgeonのCodeigniter RestserverとBackbone.jsのHTTP OPTIONSエラー

要求が絶えずOPTIONSのHTTPリクエストヘッダを送信し、すべてでPOSTリクエストをトリガしません:

は、私の研究に基づいて、私はこのpostから収集しました。

「ユーザーデータに副作用を引き起こす」リクエストを持つCORSは、実際に意図したHTTPリクエストメソッドを送信する前に、OPTIONSリクエストヘッダーでリクエストを「プリフライト」して承認を確認します。

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

真のバックボーンでemulateHTTPをSettting

Backbone.emulateHTTP = true;

  • Iは、ヘッダ内のすべてのCORSとCSRFオプション許可させました。

    ヘッダー( 'Access-Control-Allow-Origin:*');
    ヘッダー( "アクセス制御許可ヘッダー:発信元、X-Requested-With、Content-Type、Accept"); ヘッダー( "アクセス制御許可メソッド:GET、POST、OPTIONS");

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

CodeIgniter RESTServerのOPTIONS要求に応答する方法はありますか?また、この要求を会話場所から無効にすることを許可する他の方法がありますか?


私はthis on Githubを1つの解決策として見つけました。私はそれが少し古くなっているように私はそれを使用すべきかどうかわかりません。

答えて

28

まったく同じ問題が発生しました。それを解決するために、私は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を返すだけです。

+0

完璧!ありがとう! –

+0

時間を検索した後。これが解決策でした。ありがとう:) –

+0

これの上に、このようなヘッダー( 'Access-Control-Allow-Origin:'。$ _SERVER ['HTTP_ORIGIN'])のような "Access-Control-Allow-Origin"を追加できます。 ここでは、あなたのapiのどのドメインアクセスを許可するかをチェックすることができます。 –

6

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

protected $allowed_http_methods = array('get', 'delete', 'post', 'put'); 
+0

解決方法[AngularJSでのPOSTリクエストは、CodeIgniter ResetServerでプリフライトOPTIONステータスコード= 404で失敗します。](0120-18753) –

+0

これはランクの高い回答よりもはるかにクリーンです。 +1 –

関連する問題