Задать вопрос

Как настроить CORS в yii2?

Доброго времени суток. Уже который день бьюсь с корсом на yii2. Фронт на vue, бэк - на Yii2. Лежат на разных доменах.
Что бы я не делал, все запросы блокируются, даже простые. На главной происходит обращение GET за текстовой информацией, грубо говоря название сайта, описание и т.д. Никакой авторизации нет. Обычный get запрос. Отправляется два запроса и первый OPTIONS. И на него же приходит ответ "Политика одного источника запрещает чтение удаленного ресурса ...". Я в целом понимаю принцип работы. Сервер при первом запросе говорит какие заголовки может принять. Так какие бы я заголовки и параметры не разрешал, ни один запрос не проходит.
Объясните как решить проблему пожалуйста. В поисках ответа, кажется я достиг самого дна гугла и что не пробовал ничего не помогло. Закрадывается мысль может я вообще не то ищу..

На локалке такой способ работает:
spoiler
6023f526163ba615425888.png


На боевом пробовал так:
spoiler
6023f54a9ef29238056147.png

и еще миллиард вариаций параметров.

Запрос на сервер во Vue:
spoiler
6023f57c9e2f4352977865.png


Приложение тут
Данные которые хочу получить по этому адресу
  • Вопрос задан
  • 706 просмотров
Подписаться 3 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
Tpona
@Tpona
Ужасный перфекционист
В контроллере нужно разрешить выполнение запросов OPTIONS
protected function verbs()
{
    return [
        'login' => ['POST', 'OPTIONS'],
    ];
}


В настройках аутентификатора, если используется, исключи OPTIONS
public function behaviors()
{
    $behaviors = parent::behaviors();

    // remove authentication filter
    $auth = $behaviors['authenticator'];
    unset($behaviors['authenticator']);

    // add CORS filter
    $behaviors['corsFilter'] = [
        'class' => \yii\filters\Cors::className(),
    ];

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

    return $behaviors;
}

Так же при отправке запроса с клиента нужно указывать режим запроса mode
fetch(API_URL.SIGN_IN, {
      method: 'POST',
      mode: 'cors', // режим запроса
      //credentials:'include',
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(values)
    }).then ...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы