Как в REST API на Yii2 правильно настроить CORS?

Cross-Origin Resource Sharing (CORS) – это механизм, который позволяет веб-приложениям запрашивать ресурсы с другого домена. В контексте REST API на Yii2, настройка CORS позволяет разрешить или ограничить доступ к API ресурсам из других доменов.

Чтобы настроить CORS в REST API на Yii2, следуйте следующим шагам:

Шаг 1: Установка библиотеки обработки CORS
Сначала установите библиотеку yiisoft/yii2-cors, выполнив команду Composer:

composer require --prefer-dist yiisoft/yii2-cors

После установки обновите ваш файл composer.json, чтобы добавить "yiisoft/yii2-cors": "^2.0" в секцию "require".

Шаг 2: Настройка компонента CORS
Создайте новый файл конфигурации config/cors.php и добавьте в него следующий код:

<?php

return [
    'corsFilter' => [
        'class' => yiifiltersCors::class,
        'cors' => [
            'Origin' => ['*'],
            'Access-Control-Allow-Credentials' => true,
            'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
            'Access-Control-Allow-Headers' => ['*'],
            'Access-Control-Max-Age' => 86400,
        ],
    ],
];

Этот файл конфигурации настраивает компонент Cors, который обрабатывает CORS-запросы и добавляет соответствующие заголовки в ответы сервера.

Шаг 3: Настройка приложения
Откройте файл config/main.php и добавьте следующий код в секцию components:

'components' => [
    // ...
    'response' => [
        'class' => yiiwebResponse::class,
        'format' => yiiwebResponse::FORMAT_JSON,
        'charset' => 'UTF-8',
        'on beforeSend' => static function (yiibaseEvent $event) {
            /** @var yiiwebResponse $response */
            $response = $event->sender;

            $response->headers->add('Access-Control-Allow-Origin', '*');
            $response->headers->add('Access-Control-Allow-Credentials', true);
            $response->headers->add('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
            $response->headers->add('Access-Control-Allow-Headers', '*');
            $response->headers->add('Access-Control-Max-Age', 86400);
        },
    ],
    'request' => [
        // ...
        'parsers' => [
            // ...
            'application/json' => yiiwebJsonParser::class,
        ],
    ],
    'urlManager' => [
        // ...
        'rules' => [
            // ...
            ['class' => yiirestUrlRule::class, 'controller' => 'your-controller'],
        ],
    ],
    // ...
    'as cors' => configcorsCors::class,
],

В этом коде настраивается поведение компонента response, чтобы добавить соответствующие заголовки Access-Control-Allow-* в ответы сервера.

'parsers' => ['application/json' => yiiwebJsonParser::class] настраивает компонент request для автоматического разбора данных запросов с типом application/json в массивы или объекты PHP.

'rules' => ['class' => yiirestUrlRule::class, 'controller' => 'your-controller'] настраивает компонент urlManager для создания путей к вашему контроллеру.

'as cors' => configcorsCors::class добавляет фильтр Cors к вашему приложению в качестве глобального фильтра.

Шаг 4: Применение настроек CORS к вашим контроллерам
Для того, чтобы применить CORS-настройки к вашим контроллерам, добавьте следующий код в каждый контроллер, где требуется CORS:

use yiifiltersCors;

class YourController extends yiirestActiveController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['corsFilter'] = [
            'class' => Cors::class,
        ];
        return $behaviors;
    }
}

Убедитесь, что вы заменили YourController на имя вашего контроллера.

Шаг 5: Проверка работоспособности
Теперь ваши настройки CORS должны быть применены к вашему REST API на Yii2. Вы можете проверить работу, отправив запросы с другого домена и проверив заголовки ответа, которые должны содержать Access-Control-Allow-* заголовки, устанавливаемые компонентом response в main.php.

Более подробную информацию и другие возможности настройки CORS в Yii2 можно найти в официальной документации Yii2 (https://www.yiiframework.com/doc/guide/2.0/en/runtime-routing#cors-setup).