Laravel Access-Control-Allow-Origin:* Middleware

При разработке REST API часто приходится добавлять заголовки Access-Control-Allow-Origin для Cross-origin resource sharing.

Если Вы имеете дело с Laravel, не зависимо от версии, то скорее всего уже знаете что такое middleware.

Посредники (англ. middleware) предоставляют удобный механизм для фильтрации HTTP-запросов вашего приложения. Например, в Laravel есть посредник для проверки аутентификации пользователя.

Источник: https://laravel.ru/docs/v5/middleware

Посредники вызываются до того как запрос будет обработан controller's. При помощи посредников можно к примеру, проверить авторизацию пользователя и перенаправить его на страницу авторизации.

При помощи midlleware мы модифицируем заголовки ответа сервера, добавив несколько строк для Cross-origin resource sharing. Давайте разберем каждый заголовок.

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

Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS - разрешенные методы запросов. Важно всегда указывать метод OPTIONS. В ответ на запрос страницы методом OPTIONS обычно ничего не возвращает. Он служит для получения заголовков ответа от сервера перед отправкой запроса, к примеру POST или PUT методом.

Access-Control-Allow-Headers - разрешенные заголовки. К примеру, для middleware "auth:api" пользователь должен передать в заголовках токен для авторизации на сервере. Токен передается в заголовке Authorization.


Создаем Middleware CrossAll. Для этого выполните artisian-команду: php artisian make:middleware CrossAll.

После создания откройте файл app/Http/Middleware/CrossAll.php на редактирование и измените метод handle в соответствии с кодом:

 public function handle($request, Closure $next)
    {
        return $next($request)
          ->header('Access-Control-Allow-Origin', '*')
          ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
          ->header('Access-Control-Allow-Headers', 'Authorization,Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');
    }

Теперь нам необходимо добавить middleware на запросы. Вы можете добавить middleware на определенные routes или на группы routes. Подробнее о middleware вы можете почитать здесь.

Я добавил middleware на все запросы к api через файл app/Http/Kernel.php.

protected $middlewareGroups = [
        'web' => [
            ...
        ],

        'api' => [
            \App\Http\Middleware\CrossAll,
            ...
        ],
    ];