2016-09-22 2 views
4

私はYii2 Frameworkであらかじめ構築されたAPI(restfullではない)を扱っています。 JSONデータで応答し、ユーザーの種類と資格トークンに応じて要求を受け入れます。今では、CORSの競合を引き起こしている別の場所(ドメイン)にあるアプリを作成する必要があります。Yii2:非restful APIにCORSを許可する方法

私のアプリはjQueryで、データの送受信に$.ajaxを使用しています。 このCORSの競合を回避し、APIをajax経由で使用するにはどうすればよいですか?

よろしく

UPDATE:

public function behaviors() 
{ 
    $behaviors = parent::behaviors(); 
    $behaviors['corsFilter'] = [ 
     'class' => \yii\filters\Cors::className(), 
     'cors' => [ 
      'Origin'       => "*", 
      'Access-Control-Request-Method' => ['POST', 'GET'], 
      'Access-Control-Allow-Credentials' => true, 
      'Access-Control-Max-Age'   => 3600, 
     ], 
    ]; 
    return $behaviors; 
} 

しかし、私はまだエラーを取得しています:IStrangerは、私は次のコードを追加した彼の答えに私に言ったよう

。コードにbeforeActionがあると問題になることがありますか?

これはRAW HEADER

リクエストです:

Host: domain.com 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 
Accept: */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://localhost/main/main.html 
Content-Length: 296 
Origin: http://localhost 
Connection: keep-alive 

は応答:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection: Keep-Alive 
Content-Length: 101 
Content-Type: application/json; charset=UTF-8 
Date: Thu, 22 Sep 2016 17:23:48 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive: timeout=5, max=100 
Pragma: no-cache 
Server: Apache/2.4.17 (Win64) PHP/5.6.16 
Set-Cookie: PHPSESSID=ph0b322gbq65m1f3m8fp9fphc0; path=/; HttpOnly 
X-Powered-By: PHP/5.6.16 
+0

'、=> [ "*"]' '起源' を置換してください。 次に、ブラウザデバッガ(「ネットワーク」タブ)を使用してAJAXリクエストのhttpヘッダーをチェックします。要求ヘッダーには 'Origin'値があり、応答ヘッダーには' Access-Control-Allow-Credentials'と 'Access-Control-Allow-Origin'が必要です。 – IStranger

+0

@IStranger正常に動作しましたが、今は500エラーが発生しますが、OPTIONSという要求タイプを使用しています。 –

+0

@IStranger最後のコメントを無視しても、動作しません。 –

答えて

4

ちょうどあなたのAPIコントローラに追加します。

/** 
* List of allowed domains. 
* Note: Restriction works only for AJAX (using CORS, is not secure). 
* 
* @return array List of domains, that can access to this API 
*/ 
public static function allowedDomains() 
{ 
    return [ 
     // '*',      // star allows all domains 
     'http://test1.example.com', 
     'http://test2.example.com', 
    ]; 
} 

/** 
* @inheritdoc 
*/ 
public function behaviors() 
{ 
    return array_merge(parent::behaviors(), [ 

     // For cross-domain AJAX request 
     'corsFilter' => [ 
      'class' => \yii\filters\Cors::className(), 
      'cors' => [ 
       // restrict access to domains: 
       'Origin'       => static::allowedDomains(), 
       'Access-Control-Request-Method' => ['POST'], 
       'Access-Control-Allow-Credentials' => true, 
       'Access-Control-Max-Age'   => 3600,     // Cache (seconds) 
      ], 
     ], 

    ]); 
} 

このコードはに追加されます応答仕様al http-headers。リクエストのhttpヘッダーはOriginである必要があります(Crossdomain AJAXではブラウザによって自動的に追加されます)。応答HTTPヘッダーには、Access-Control-*ヘッダーが必要です。

注:これらのhttpヘッダーが表示されない場合は、おそらく\yii\filters\Corsが機能しない可能性があります。コントローラー内の他の動作やフィルターを確認してください。 (それは外部からのアクセスを防ぐことがあります)、このコントローラのCSRFの検証を無効にしてください:

/** 
* Controller for API methods. 
*/ 
class ApiController extends Controller 
{ 

    /** 
    * @var bool See details {@link \yii\web\Controller::$enableCsrfValidation}. 
    */ 
    public $enableCsrfValidation = false; 

    // ... 
} 

UPD:また、あなたのウェブサーバーをチェックする必要があります。おそらくnginxは追加の設定を必要とするかもしれませんが、Apacheは再起動が必要です。

UPD2:ここより完全な命令:https://stackoverflow.com/a/42435695/3793592

+0

あなたの答えについて私の質問を編集しています。 –

+0

私はすでにCSRFを無効にしています。 –

+0

私はApacheを再起動して動作しました。私は、Apacheのキャッシュや何かが問題を持続させると思う。 –

関連する問題