Implementa https://github.com/fruitcake/php-cors para Laravel
Desde Laravel 9.2, este Middleware está incluido en laravel/framework. Puede utilizar el middleware proporcionado, que debería ser compatible con el middleware y la configuración proporcionados en este paquete. Consulte https://github.com/laravel/laravel/pull/5825/files para ver los cambios.
Pasos para actualizar:
Elimina "fruitcake/laravel-cors"
de tu compositor.json
Reemplace FruitcakeCorsHandleCors::class,
con IlluminateHttpMiddlewareHandleCors::class,
en app/Http/Kernel.php
Consulte https://github.com/fruitcake/php-cors
para un uso avanzado. La configuración sigue siendo la misma.
El paquete laravel-cors
le permite enviar encabezados de intercambio de recursos entre orígenes con la configuración del middleware Laravel.
Si desea tener una descripción general global del flujo de trabajo de CORS, puede explorar esta imagen.
Al actualizar desde las versiones 0.x, hay algunos cambios importantes:
Se utiliza una nueva propiedad 'rutas' para habilitar/deshabilitar CORS en ciertas rutas. Esto está vacío de forma predeterminada, ¡así que rellénelo correctamente!
El middleware de grupo ya no es compatible; utilice el middleware global
El nombre del proveedor ha cambiado (ver instalación/uso)
La carcasa de los accesorios en cors.php
ha cambiado de camelCase a Snake_case, por lo que si ya tiene un archivo cors.php
necesitará actualizar los accesorios allí para que coincidan con la nueva carcasa.
Maneja solicitudes de OPCIONES previas al vuelo de CORS
Agrega encabezados CORS a sus respuestas
Haga coincidir rutas para agregar CORS solo a ciertas solicitudes
Solicite el paquete fruitcake/laravel-cors
en su composer.json
y actualice sus dependencias:
el compositor requiere pastel de frutas/laravel-cors
Si surge un conflicto, esto podría deberse a que está instalada una versión anterior de barryvdh/laravel-cors o fruitcake/laravel-cors. Primero elimine el paquete conflictivo y luego intente instalarlo nuevamente:
compositor eliminar barryvdh/laravel-cors fruitcake/laravel-cors el compositor requiere pastel de frutas/laravel-cors
Para permitir CORS para todas sus rutas, agregue el middleware HandleCors
en la parte superior de la propiedad $middleware
de la clase app/Http/Kernel.php
:
protegido $middleware = [ FruitcakeCorsHandleCors::clase,// ...];
Ahora actualice la configuración para definir las rutas en las que desea ejecutar el servicio CORS (consulte Configuración a continuación):
'rutas' => ['api/*'],
Los valores predeterminados se establecen en config/cors.php
. Publique la configuración para copiar el archivo a su propia configuración:
Proveedor artesanal de php: publicar --tag="cors"
Nota: Cuando utilice encabezados personalizados, como
X-Auth-Token
oX-Requested-With
, debe configurarallowed_headers
para incluir esos encabezados. También puede configurarlo en['*']
para permitir todos los encabezados personalizados.
Nota: Si incluye encabezados explícitamente en la lista blanca, debe incluir
Origin
o las solicitudes no podrán ser reconocidas como CORS.
Opción | Descripción | Valor predeterminado |
---|---|---|
caminos | Puede habilitar CORS para 1 o varias rutas, por ejemplo. ['api/*'] | [] |
métodos_permitidos | Coincide con el método de solicitud. | ['*'] |
orígenes_permitidos | Coincide con el origen de la solicitud. Se pueden utilizar comodines, por ejemplo. *.mydomain.com o mydomain.com:* | ['*'] |
patrones_origins_permitidos | Coincide con el origen de la solicitud con preg_match . | [] |
encabezados_permitidos | Establece el encabezado de respuesta Access-Control-Allow-Headers. | ['*'] |
encabezados_expuestos | Establece el encabezado de respuesta Access-Control-Expose-Headers. | [] |
edad_max | Establece el encabezado de respuesta Access-Control-Max-Age. | 0 |
admite_credenciales | Establece el encabezado Access-Control-Allow-Credentials. | false |
allowed_origins
, allowed_headers
y allowed_methods
se pueden configurar en ['*']
para aceptar cualquier valor.
Nota: Para
allowed_origins
debe incluir el esquema cuando no utilice un comodín, por ejemplo.['http://example.com', 'https://example.com']
. También debes tener en cuenta que el esquema estará presente al usarallowed_origins_patterns
.
Nota: trate de ser lo más específico posible. Puedes empezar a desarrollar con restricciones flexibles, ¡pero es mejor ser lo más estricto posible!
Nota: Debido a la anulación del método http en Laravel, permitir los métodos POST también permitirá a los usuarios de API realizar solicitudes PUT y DELETE.
Nota: A veces es necesario especificar el puerto (por ejemplo, cuando codificas tu aplicación en un entorno local) . Aquí también puede especificar el puerto o utilizar un comodín, por ejemplo.
localhost:3000
,localhost:*
o incluso usando un FQDNapp.mydomain.com:8080
En Lumen, simplemente registre el proveedor de servicios manualmente en su archivo bootstrap/app.php
:
$aplicación->registro(FruitcakeCorsCorsServiceProvider::clase);
También copie el archivo de configuración cors.php a config/cors.php
y póngalo en acción:
$aplicación->configure('cors');
Para permitir CORS para todas sus rutas, agregue el middleware HandleCors
al middleware global y establezca la propiedad paths
en la configuración.
$aplicación->middleware([// ...FruitcakeCorsHandleCors::clase, ]);
Asegúrese de que la opción path
en la configuración sea correcta y realmente coincida con la ruta que está utilizando. Recuerde borrar también el caché de configuración.
A veces, los errores/middleware que devuelven respuestas propias pueden impedir que se ejecute CORS Middleware. Intente cambiar el orden del middleware y asegúrese de que sea la primera entrada en el middleware global, no un grupo de rutas. También verifique sus registros para detectar errores reales, porque sin CORS, el navegador tragará los errores y solo mostrará errores de CORS. Intente ejecutarlo también sin CORS para asegurarse de que realmente funcione.
Si su Solicitud incluye un encabezado de Autorización o usa el modo Credenciales, establezca el valor supports_credentials
en la configuración en verdadero. Esto establecerá el encabezado Access-Control-Allow-Credentials en true
.
Si usa echo()
, dd()
, die()
, exit()
, dump()
etc. en su código, interrumpirá el flujo del Middleware. Cuando la salida se envía antes de los encabezados, no se puede agregar CORS. Cuando el script finaliza antes de que finalice el middleware CORS, no se agregarán encabezados CORS. Siempre devuelve una respuesta adecuada o lanza una excepción.
Si es posible, utilice un grupo de rutas con la protección CSRF deshabilitada. De lo contrario, puede desactivar CSRF para determinadas solicitudes en AppHttpMiddlewareVerifyCsrfToken
:
protegido $except = ['api/*','sub.domain.zone' => [ 'prefijo/*'], ];
El Middleware CORS debe ser el único lugar donde agregue estos encabezados. Si también agrega encabezados en .htaccess, nginx o su archivo index.php, obtendrá encabezados duplicados y resultados inesperados.
Si no realiza solicitudes entre sitios, es decir, si no solicita site-a.com/api desde site-b.com, su navegador no enviará el encabezado de solicitud Origin: https://site-b.com
. CORS estará "deshabilitado" ya que también faltará el encabezado Access-Control-Allow-Origin
. Esto sucede porque las solicitudes se envían desde el mismo y en este caso no se necesita protección.
Publicado bajo la licencia MIT, consulte LICENCIA.