2017-01-14 48 views
13

Po This question mam ustawione mego odpoczynku zachowanie kontrolera jakoYii2 Cors filtruje błąd, który nie 'Access-Control-Allow-Origin' header jest obecny

public function behaviors() 
{ 
    $behaviors = parent::behaviors(); 

    $auth= $behaviors['authenticator'] = [ 
     'class' => HttpBearerAuth::className(), 
     'only' => ['dashboard'], 
    ]; 
    $behaviors['contentNegotiator'] = [ 
     'class' => ContentNegotiator::className(), 
     'formats' => [ 
      'application/json' => Response::FORMAT_JSON, 
     ], 
    ]; 
    $acces=$behaviors['access'] = [ 
     'class' => AccessControl::className(), 
     'only' => ['login'], 
     'rules' => [ 
      [ 
       'actions' => ['login'], 
       'allow' => true, 
       'roles' => ['?'], 
      ], 
     ], 
    ]; 

    unset($behaviors['authenticator']); 
    unset($behaviors['access']); 

A teraz filtry Cors

// add CORS filter 
    $behaviors['corsFilter'] = [ 
     'class' => \yii\filters\Cors::className(), 
      'cors' => [ 
     // restrict access to 
     'Access-Control-Allow-Origin' => ['*'], 
     'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'], 
     // Allow only POST and PUT methods 
     'Access-Control-Request-Headers' => ['*'], 
     // Allow only headers 'X-Wsse' 
     'Access-Control-Allow-Credentials' => true, 
     // Allow OPTIONS caching 
     'Access-Control-Max-Age' => 86400, 
     // Allow the X-Pagination-Current-Page header to be exposed to the browser. 
     'Access-Control-Expose-Headers' => [], 
     ] 
    ]; 

    // re-add authentication filter 
    $behaviors['authenticator'] = $auth; 
     $behaviors['access'] = $access; 
    // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method) 
    $behaviors['authenticator']['except'] = ['options']; 
    return $behaviors; 
} 

Nakładka moja angular2 jako Ale nadal otrzymuję komunikat o błędzie

Response to preflight request doesn't pass access control check: No 
'Access-Control-Allow-Origin' header is present on the requested resource. Origin 
'http://localhost:3000' is therefore not allowed access. 

Co może być nie tak, ponieważ ive ustawić filtr Cors zachowań yii2 rozbrojony uwierzytelniający i dodaje go później Co mogę być brakuje

Mam również sprawdzony na This link a także this one ale żaden rozwiązuje kwestia

+0

'Access-Control-Request-Headers' jest na stronie klienta, po stronie serwera należy użyć' Access- Control-Allow-Headers' – particleflux

+0

próbował dodać Access-control-allow-headers ['*'], ale nadal nie działa –

+0

Spróbuj zastąpić "Access-Control-Allow-Origin" => ['*'], z "Origin" => ['*'], –

Odpowiedz

6

W przypadku jakichkolwiek problemów z nagłówkami Cors, polecam użyć następujących instrukcji:

  1. Dodaj Cors konfiguracja do kontrolera. Na przykład:

    /** 
    * 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) 
          ], 
         ], 
    
        ]); 
    } 
    
  2. Powyższy kod doda do odpowiedzi specjalnych nagłówków HTTP. Sprawdź nagłówki http za pomocą narzędzi do debugowania przeglądarki:

  3. Żądanie nagłówka http powinno zawierać Origin. Zostanie on automatycznie dodany przez przeglądarkę w Crossdomain AJAX. Ten nagłówek http można dodać również za pośrednictwem biblioteki JS. Bez tego nagłówka http corsFilter nie będzie działać.

    POST /api/some-method-name HTTP/1.1 
    Host: api.example.com 
    Connection: keep-alive 
    Content-Length: 86 
    Accept: */* 
    Origin: https://my-site.example.com 
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
    Referer: https://my-site.example.com/ 
    Accept-Encoding: gzip, deflate, br 
    Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,ru;q=0.4 
    
  4. nagłówki HTTP Response powinna zawierać Access-Control-* nagłówków. Ten nagłówek http zostanie dodany przez corsFilter.

    HTTP/1.1 200 OK 
    Access-Control-Allow-Credentials: true 
    Access-Control-Allow-Origin: https://my-site.example.com 
    Content-Type: application/json; charset=UTF-8 
    Date: Fri, 24 Feb 2017 09:21:47 GMT 
    Server: Apache 
    Content-Length: 27 
    Connection: keep-alive 
    
  5. Jeśli nie widzisz tych nagłówków http w odpowiedzi, prawdopodobnie oznacza to, że \yii\filters\Cors nie działa.

  6. Sprawdź inne zachowania/filtry w kontrolerze. Spróbuj dodać corsFilter jako pierwsze zachowanie . Prawdopodobnie niektóre inne zachowania uniemożliwiają wykonanie corsFilter.

  7. Spróbuj wyłączyć CSRF poprawności dla tego kontrolera (może to uniemożliwić dostęp zewnętrzny):

    /** 
    * Controller for API methods. 
    */ 
    class ApiController extends Controller 
    { 
    
        /** 
        * @var bool See details {@link \yii\web\Controller::$enableCsrfValidation}. 
        */ 
        public $enableCsrfValidation = false; 
    
        // ... 
    } 
    
  8. Dodatkowo należy sprawdzać swój web-server. Prawdopodobnie nginx może wymagać dodatkowej konfiguracji, apache może wymagać restartowania.

  9. Access-Control-* nagłówki w odpowiedzi można dodać za pomocą serwera WWW (patrz: apache i nginx). Ale nie polecam tego w ten sposób, ponieważ w tym przypadku nie można zarządzać http-haders za pomocą aplikacji.

  10. Niektóre użyteczne informacje można znaleźć tutaj:

3

Spróbuj to:

public static function allowedDomains() 
{ 
    return [ 
     // '*',      // star allows all domains 
     'http://localhost:3000', 
     'http://test2.example.com', 
    ]; 
} 



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) 

       ], 
      ], 

     ]); 
    } 

Dodaj tę funkcję w swojej kontroler .

I jedno angular2 zastosowanie metoda OPCJA na pierwszy raz to pozwalają metodę opcję również