Laravel 5.1 API Habilitar Cors

He buscado algunas formas de habilitar cors en laravel 5.1 específicamente, he encontrado algunas librerías como:

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

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

pero ninguno de ellos tiene un tutorial de implementación específicamente para Laravel 5.1, intenté configurarlo pero no funciona.

Si alguien ya implementó CORS en laravel 5.1 estaría agradecido por la ayuda …

Aquí está mi middleware CORS:

 '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; } } 

Para utilizar el middleware CORS, primero debe registrarlo en su archivo de la aplicación \ Http \ Kernel.php de la siguiente manera:

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

Entonces puedes usarlo en tus rutas

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

Siempre uso un método fácil. Simplemente agregue las líneas siguientes al archivo \public\index.php . No es necesario que uses un middleware, creo.

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

barryvdh / laravel-cors funciona perfectamente con Laravel 5.1 con solo unos pocos puntos clave para habilitarlo.

  1. Después de agregarlo como una dependencia de compositor, asegúrese de haber publicado el archivo de configuración CORS y ajustado los encabezados CORS como desee. Así es como miro en app / config / cors.php

      true, 'allowedOrigins' => ['*'], 'allowedHeaders' => ['*'], 'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE'], 'exposedHeaders' => ['DAV', 'content-length', 'Allow'], 'maxAge' => 86400, 'hosts' => [], ]; 
  2. Después de esto, hay un paso más que no se menciona en la documentación, debe agregar el controlador CORS 'Barryvdh\Cors\HandleCors' en el kernel de la Aplicación. Prefiero usarlo en la stack de middleware global. Me gusta esto

     /** * 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', ]; 

    Pero depende de usted usarlo como middleware de ruta y colocarlo en rutas específicas.

Esto debería hacer que el paquete funcione con L5.1

Estoy usando Laravel 5.4 y, desafortunadamente, aunque la respuesta aceptada parece correcta, para solicitudes pre-iluminadas (como PUT y DELETE ) que van precedidas de una solicitud OPTIONS , especificando el middleware en la matriz $routeMiddleware (y usando eso en el archivo de definición de rutas) no funcionará a menos que también defina un manejador de ruta para OPTIONS . Esto es porque sin una ruta OPTIONS Laravel responderá internamente a ese método sin los encabezados CORS.

En resumen, defina el middleware en la matriz $middleware que se ejecuta globalmente para todas las solicitudes o si lo hace en $middlewareGroups o $routeMiddleware entonces también defina un manejador de ruta para OPTIONS . Esto se puede hacer así:

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

También escribí un middleware para el mismo propósito que se ve similar pero es más grande en tamaño ya que trata de ser más configurable y maneja un montón de condiciones también:

 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; } } 

También escribí una publicación de blog sobre esto.