spatie read origin habilitar error cross corb configurar barryvdh barryd php api laravel cors laravel-5.1

php - read - Laravel 5.1 API Enable Cors



php cors error (4)

He buscado algunas formas de habilitar cors en laravel 5.1 específicamente, he encontrado algunas bibliotecas 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 implementara CORS en laravel 5.1, agradecería la ayuda ...


Aquí está mi middleware 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; } }

Para usar el middleware CORS, primero debe registrarlo en su archivo app / Http / Kernel.php:

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

Entonces puedes usarlo en tus rutas

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


Estoy usando Laravel 5.4 y desafortunadamente, aunque la respuesta aceptada parece estar bien, para solicitudes con verificación previa (como PUT y DELETE ) que irán precedidas de una solicitud de OPTIONS , especificando el middleware en la matriz $routeMiddleware (y usándolo en el archivo de definición de rutas) no funcionará a menos que también defina un controlador de ruta para OPTIONS . Esto se debe a que 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 está haciendo en $middlewareGroups o $routeMiddleware , también defina un controlador 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 parece 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:

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

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


Siempre uso un método fácil. Simplemente agregue las siguientes líneas al archivo /public/index.php . No tienes que usar un middleware, creo.

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


https://github.com/barryvdh/laravel-cors funciona perfectamente con Laravel 5.1 con solo algunos puntos clave para habilitarlo.

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

    <?php return [ ''supportsCredentials'' => 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 pila global de middleware. 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