Laravel 5.1 API Enable Cors

Я искал некоторые способы включения cors на laravel 5.1 в частности, я нашел несколько таких библиотек, как:

https://github.com/neomerx/cors-illuminate

https://github.com/barryvdh/laravel-cors

но ни один из них не имеет учебника по внедрению специально для Laravel 5.1, я пытался настроить его, но он не работает.

Если кто-то уже реализовал CORS на laravel 5.1, я был бы благодарен за помощь …

Solutions Collecting From Web of "Laravel 5.1 API Enable Cors"

Вот мое промежуточное ПО CORS:

<?php namespace App\Http\Middleware; use Closure; class CORS { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { header("Access-Control-Allow-Origin: *"); // ALLOW OPTIONS METHOD $headers = [ 'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE', 'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin' ]; if($request->getMethod() == "OPTIONS") { // The client-side application can set only headers allowed in Access-Control-Allow-Headers return Response::make('OK', 200, $headers); } $response = $next($request); foreach($headers as $key => $value) $response->header($key, $value); return $response; } } 

Чтобы использовать промежуточное ПО CORS, вы должны сначала зарегистрировать его в файле app \ Http \ Kernel.php следующим образом:

 protected $routeMiddleware = [ //other middlewares 'cors' => 'App\Http\Middleware\CORS', ]; 

Затем вы можете использовать его на своих маршрутах

 Route::get('example', array('middleware' => 'cors', 'uses' => 'ExampleController@dummy')); 

Я всегда использую простой метод. Просто добавьте ниже строки в файл \public\index.php . Думаю, вам не нужно использовать промежуточное ПО.

 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); 

barryvdh / laravel-cors отлично работает с Laravel 5.1 с несколькими ключевыми моментами в его включении.

  1. После добавления в качестве зависимости композитора убедитесь, что вы опубликовали конфигурационный файл CORS и скорректировали заголовки CORS, как вы того захотите. Вот как я выгляжу в app / config / cors.php

     <?php return [ 'supportsCredentials' => true, 'allowedOrigins' => ['*'], 'allowedHeaders' => ['*'], 'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE'], 'exposedHeaders' => ['DAV', 'content-length', 'Allow'], 'maxAge' => 86400, 'hosts' => [], ]; 
  2. После этого есть еще один шаг, который не упоминается в документации, вам нужно добавить обработчик CORS 'Barryvdh\Cors\HandleCors' в ядро ​​приложения. Я предпочитаю использовать его в глобальном стеке промежуточного программного обеспечения. Как это

     /** * The application's global HTTP middleware stack. * * @var array */ protected $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', 'Illuminate\View\Middleware\ShareErrorsFromSession', 'Barryvdh\Cors\HandleCors', ]; 

    Но это зависит от вас, чтобы использовать его в качестве промежуточного ПО маршрута и размещать его по определенным маршрутам.

Это должно сделать пакет работы с L5.1

Я использую Laravel 5.4 и, к сожалению, хотя принятый ответ кажется хорошим, для запрошенных запросов (например, PUT и DELETE ), которым будет предшествовать запрос OPTIONS , указав промежуточное ПО в массиве $routeMiddleware (и используя это в файле определения маршрутов) не будет работать, если вы также не определите обработчик маршрута для OPTIONS . Это связано с тем, что без маршрута OPTIONS Laravel будет внутренне реагировать на этот метод без заголовков CORS.

Короче говоря, либо определяем промежуточное ПО в массиве $middleware который выполняется глобально для всех запросов, либо если вы делаете это в $middlewareGroups или $routeMiddleware тогда также определяете обработчик маршрута для OPTIONS . Это можно сделать следующим образом:

 Route::match(['options', 'put'], '/route', function () { // This will work with the middleware shown in the accepted answer })->middleware('cors'); 

Я также написал промежуточное программное обеспечение для той же цели, которая выглядит аналогично, но больше по размеру, поскольку она пытается быть более настраиваемой и обрабатывает множество условий:

 <?php namespace App\Http\Middleware; use Closure; class Cors { private static $allowedOriginsWhitelist = [ 'http://localhost:8000' ]; // All the headers must be a string private static $allowedOrigin = '*'; private static $allowedMethods = 'OPTIONS, GET, POST, PUT, PATCH, DELETE'; private static $allowCredentials = 'true'; private static $allowedHeaders = ''; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (! $this->isCorsRequest($request)) { return $next($request); } static::$allowedOrigin = $this->resolveAllowedOrigin($request); static::$allowedHeaders = $this->resolveAllowedHeaders($request); $headers = [ 'Access-Control-Allow-Origin' => static::$allowedOrigin, 'Access-Control-Allow-Methods' => static::$allowedMethods, 'Access-Control-Allow-Headers' => static::$allowedHeaders, 'Access-Control-Allow-Credentials' => static::$allowCredentials, ]; // For preflighted requests if ($request->getMethod() === 'OPTIONS') { return response('', 200)->withHeaders($headers); } $response = $next($request)->withHeaders($headers); return $response; } /** * Incoming request is a CORS request if the Origin * header is set and Origin !== Host * * @param \Illuminate\Http\Request $request */ private function isCorsRequest($request) { $requestHasOrigin = $request->headers->has('Origin'); if ($requestHasOrigin) { $origin = $request->headers->get('Origin'); $host = $request->getSchemeAndHttpHost(); if ($origin !== $host) { return true; } } return false; } /** * Dynamic resolution of allowed origin since we can't * pass multiple domains to the header. The appropriate * domain is set in the Access-Control-Allow-Origin header * only if it is present in the whitelist. * * @param \Illuminate\Http\Request $request */ private function resolveAllowedOrigin($request) { $allowedOrigin = static::$allowedOrigin; // If origin is in our $allowedOriginsWhitelist // then we send that in Access-Control-Allow-Origin $origin = $request->headers->get('Origin'); if (in_array($origin, static::$allowedOriginsWhitelist)) { $allowedOrigin = $origin; } return $allowedOrigin; } /** * Take the incoming client request headers * and return. Will be used to pass in Access-Control-Allow-Headers * * @param \Illuminate\Http\Request $request */ private function resolveAllowedHeaders($request) { $allowedHeaders = $request->headers->get('Access-Control-Request-Headers'); return $allowedHeaders; } } 

Также написал сообщение в блоге об этом.