2017-05-29 2 views
1

Ich habe eine Yii2 REST API-Anwendung entwickelt. Im Lokal funktioniert alles gut. Ich habe die Anwendung auf Remote-Server bereitgestellt. Ich konnte über Postman eine Antwort bekommen. Aber wenn ich versuche, eine Anfrage mit AJAX oder Angular zu stellen, bekomme ich "Antwort für preflight hat ungültigen HTTP-Statuscode 401" Fehler. mein Controller-Verhalten() Methode:YII 2 REST CORS Problem auf Remote-Server

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(), 
     ], 

    ]); 
} 

Antwort und Request-Header:

enter image description here

enter image description here

enter image description here

Ich nehme an, dies ist Thema CORS, aber ich kann nicht herausfinden, Warum funktioniert das nicht auf dem Remote-Server, auf dem Centos läuft? Apache.

Ich habe verlängert HTTPBasicAuth und meine eigene AvnrHttpBasicAuth-Klasse

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; 
    } 
} 

Antwort

1

Ich habe dieses Problem mit einer kleinen Änderung an meiner .htaccess-Datei gelöst. Dank dieser

haben diese beiden Zeilen unten in .htaccess-Datei den Trick gemacht.

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

Sie benötigen eine Ausnahme für Preflight-Anforderungen hinzufügen, wie in official docs gezeigt:

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

Preflight Requests werden durch Browser behandelt/ausgegeben werden, wenn erforderlich. Wenn beispielsweise Frontend und Backend in verschiedenen Domänen gehostet werden und Sie eine POST-Anfrage als Beispiel machen, muss der Browser zuerst eine OPTIONS-Anfrage senden, um zu sehen, ob POST erlaubt ist, bevor er die echte sendet. Um es von POSTMAN zu testen, müssen Sie eine OPTIONS-Anfrage anstelle von POST/PUT senden.

+0

Ich habe 'except' => ['options'] Ausnahme, aber immer noch das gleiche. – Chamindar2002

+0

Wie auch immer http: //XXX.XXX.73.161/~dsltrading/v1/web/api/customer/view? Id = 1 gibt zurück: 405 "Methode nicht zulässig. Diese URL kann nur die folgenden Anfrage-Methoden behandeln: GET, HEAD – Chamindar2002

+0

Ich nahm an, dass 'AvnrHttpBasicAuth' eine' except' Eigenschaft als alle offiziellen Yii2-Filter hat, aber es kann es nicht haben. Ich weiß nicht, welche Bibliothek das ist. –

Verwandte Themen