2017-05-29 5 views
1

私はYii2 REST APIアプリケーションを開発しました。すべてがローカルでうまく動作しています。 リモートサーバーにアプリケーションを展開しました。私は郵便配達員を介してAPIの応答を得ることができます。しかし、AJAXやAngularでリクエストをしようとすると、「プリフライトのレスポンスに無効なHTTPステータスコード401があります」というエラーが表示されます。 私のコントローラの動作()メソッド:YII 2リモートサーバー上のREST CORSの問題

public function behaviors() { 

    return array_merge(parent::behaviors(), [ 


     $behaviors['corsFilter'] = [ 
      'class' => \yii\filters\Cors::className(), 
      'cors' => [ 
       // restrict access to domains: 
       'Origin'       => ['*'], 
       'Access-Control-Request-Method' => ['GET','POST','PUT','DELETE','OPTIONS'], 
       'Access-Control-Request-Headers' => ['*'], 
       'Access-Control-Allow-Credentials' => true, 
       'Access-Control-Max-Age'   => 3600,     // Cache (seconds) 
      ], 
     ], 
     $behaviors['authenticator'] = [ 
      'class' => AvnrHttpBasicAuth::className(), 
     ], 

    ]); 
} 

レスポンスとリクエストヘッダ:enter image description here

enter image description here

enter image description here

が、私はこれが前提とはCORSの問題ですが、私は把握することはできませんなぜCentOS上で実行されているリモートサーバ上で動作していないのですか? apache。

私はHttpBasicAuthを拡張し、あなたがofficial docsに示すように、プリフライトリクエストの例外を追加する必要があり、私自身AvnrHttpBasicAuthクラス

class AvnrHttpBasicAuth extends HttpBasicAuth 
{ 
    public function authenticate($user, $request, $response) 
    { 

     $authHeader = $request->getHeaders()->get('Authorization'); 

     if ($authHeader !== null && preg_match("/^Basic\\s+(.*?)$/", $authHeader, $matches)) { 

      $identity = $user->loginByAccessToken($matches[1], get_class($this)); 

      if ($identity === null) { 
       $this->handleFailure($response); 
      } 
      return $identity; 
     } 
     return null; 
    } 
} 

答えて

1

私はこの問題を私の.htaccessファイルのマイナーな変更で解決しました。 ありがとうこれはありがとうpost

.htaccessファイルの下のこれらの2行がトリックでした。

RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L] 
Header always set Access-Control-Allow-Origin "*" 
1

を使用しています

$behaviors['authenticator'] = [ 
    'class' => AvnrHttpBasicAuth::className(), 
    'except' => ['options'] 
], 

Preflight Requestsはときに、ブラウザによって発行/処理されます必要です。フロントエンドとバックエンドが異なるドメインでホストされていて、POSTリクエストを作成している場合と同様に、ブラウザはまずOPTIONSリクエストを送信して、実際にPOSTを送信する前にPOSTが許可されているかどうかを確認する必要があります。 POSTMANからテストするには、POST/PUTの代わりにOPTIONSリクエストを送る必要があります。

+0

'except' => ['options']例外を追加しましたが、それでも同じです。 – Chamindar2002

+0

http://XXX.XXX.73.161/~dsltrading/v1/web/api/customer/view?id = 1 returns:405 "Method not Allowed。このURLは、次のリクエストメソッドしか処理できません:GET、HEAD – Chamindar2002

+0

私は 'AvnrHttpBasicAuth'にはYii2の公式フィルタのすべての' except'プロパティがあると仮定しましたが、それはないかもしれません。どのライブラリがそれなのか分かりません。 –

関連する問題