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

Как победить противный CORS в Yii?

Пишу приложение REST. Есть контроллер test. Обращения AJAX к дефолтным урлам типа 127.0.0.1:8000/tests работают нормально. Пробую добавить кастомный URL. В контроллере создаю соответствующий action :
public function actionYo()
    {         return ['result' => 'YO! Pipol!!!! ']; }


в роутах добавляю

[
        'class' => 'yii\rest\UrlRule',
        'controller' => 'test',
        'extraPatterns' => [
            'GET yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx'
          //пробовал танцевать с бубном вот так - без толку
          //  'OPTIONS yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx'
        ],
    ],


в postman все работает а в браузере НЕТ. Любимый до слез CORS на страже безопасности!
Если использую еще и // 'OPTIONS yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx' - получаю 401 Unauthorized,
если только 'GET yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx' , то 404 Not Found

Насколько я понимаю, OPTIONS запросы Yii , вообще, должен разруливать самостоятельно.
Дефолтные урлы работают нормально. Cors выглядит вот так (лежит в BaseController от которого и наследуюсь) :

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


            ],
        ];


Силы и НЕВРЫ на исходе. Само приложение не начинал , ибо воюю с этой....мм..м...б.... нехорошей штукой.

Спасибо!

UPD На решение натолкнул ответ Decadal. Его варинат рабочий, но писать роуты для каждого нестандартного экшна ,это ...лень! )))
Как известно в Yii имеется ActiveController от которого мы наследуемся , когда пишем свои REST контроллеры. В нем уже определены экшны для стандартных REST роутов. Есть там и экшн для OPTIONS. Таким образом мы можем добавить правило для роутов, которое будет отправлять все OPTIONS запросы на этот экшн. Не надо писать костыли для каждого нестандартного экшна, который нам нужен. Делается это двумя строчками :

[
        'class' => 'yii\rest\UrlRule',
        'controller' => ['test', 'best'], // строчка ОДЫН - здесь все контроллеры, для которых это должно работать
        'extraPatterns' => [
        //строчка ДЫВА - эта штука будет отправлять все на экшн options, он уже есть в родительском ActiveController
            'OPTIONS <action:\w+>' => 'options'
        ],
    ],
  • Вопрос задан
  • 595 просмотров
Подписаться 3 Простой 2 комментария
Решения вопроса 1
Decadal
@Decadal
Насколько я понимаю, OPTIONS запросы Yii , вообще, должен разруливать самостоятельно.


если вы сами это не настроите, оно не будет ничего разруливать.

Нужно чтобы любой опшнс запрос уходил на роут одного и того же контроллера который 1) не требует авторизации 2) возвращает все нужные заголовки. Настроить это универсально с помощью роутинга yii2 мне так и не удалось, пришлось хардкодить разные уровни роутов и переадресовывать их на единый метод.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Я вижу конфиг, в нем все необходимые данные. На его основе можно написать несколько строк кода, которые будут генерировать нужные заголовки.

Так-же если в ответе не приходит заголовок Access-Control-Allow-Origin: http://localhost:8080, то попробуй его добавить в список заголовков в конфиге. Лично мне его хватало с головой.
Ответ написан
Ваш ответ на вопрос

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

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