2017-05-29 42 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上運行的遠程服務器阿帕奇。

我已經擴展HttpBasicAuth並用自己的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文件中有所竅門。

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

您需要添加一個例外預檢要求,如圖official docs

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

Preflight Requests的處理/通過瀏覽器的時候發出需要。比如當前端和後端託管在不同的域中,並且以POST請求爲例時,瀏覽器需要首先發送一個OPTIONS請求,以便在發送真正的請求之前查看POST是否被允許。要從POSTMAN測試它,你需要發送一個OPTIONS請求,而不是POST/PUT。

+0

我加入 '除了'=> [ '選項']異常,但仍然是相同的。 – Chamindar2002

+0

http://XXX.XXX.73.161/~dsltrading/v1/web/api/customer/view?id = 1返回:405「Method Not Allowed。該URL只能處理以下請求方法:GET,HEAD – Chamindar2002

+0

我認爲'AvnrHttpBasicAuth'具有所有Yii2官方過濾器的'except'屬性,但它可能沒有。我不知道什麼庫是。 –