php - habilitar - CORS con Laravel 4
laravel 5.6 cors (3)
Estoy escribiendo una API y usando Laravel 4 para lograrlo. Mi api está en un dominio diferente. Supongamos que es: http://api-example.com/
Y cuando trato de realizar solicitudes ajax a través de Backbone a mi api desde mi aplicación web (es decir, mydomain.com
) con autenticación básica, a veces funciona bien, pero a veces no. Estoy tratando de averiguar por qué. A continuación se muestran mi App::before
filtro y la App::after
filtro.
App::before(function($request)
{
if($_SERVER[''REQUEST_METHOD''] === ''OPTIONS'') {
$statusCode = 204;
$headers = [
''Access-Control-Allow-Origin'' => ''http://mydomain.com'',
''Allow'' => ''GET, POST, OPTIONS'',
''Access-Control-Allow-Headers'' => ''Origin, Content-Type, Accept, Authorization, X-Requested-With'',
''Access-Control-Allow-Credentials'' => ''true''
];
return Response::make(null, $statusCode, $headers);
}
});
Y mi filtro posterior:
App::after(function($request, $response)
{
$response->headers->set(''Access-Control-Allow-Origin'', ''http://mydomain.com'');
$response->headers->set(''Allow'', ''GET, POST, OPTIONS'');
$response->headers->set(''Access-Control-Allow-Headers'', ''Origin, Content-Type, Accept, Authorization, X-Requested-With'');
$response->headers->set(''Access-Control-Allow-Credentials'', ''true'');
return $response;
});
El problema es que cuando intento realizar una solicitud de publicación para /login
con las credenciales, la API comprueba la base de datos y obtiene la clave API para el usuario. Esto está funcionando bien. Pero cuando intento realizar una solicitud POST a /users
chrome solo aparece el siguiente error:
XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.
Intenté todo, como configurar Access-Control-Allow-Origin
en ''*''
todo lo que pude encontrar desde Internet. Pero nada funcionó hasta ahora. No sé qué debo hacer.
Algunos navegadores pueden negar esto, porque los scripts XSS están haciendo cosas desagradables de esa manera.
Si carga su archivo js desde http://api-example.com/ puede ayudar, pero hay soluciones más estables:
- Puedes usar rizo (o algo similar) o
- Puede usar un proxy (Apache, Nginx, etc.) para su solicitud AJAX para cargar la respuesta del otro host
- O si está utilizando un equilibrador de carga, o cosas de almacenamiento en caché frontend, puede crear una regla ...
Depende de su infraestructura y sus necesidades, pero si el rendimiento es importante, omita la curvatura.
Hay un error en el nombre del encabezado.
header(''Allow'', ''GET, POST, OPTIONS''); // This is wrong.
header(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS''); // This is right.
No tiene sentido hacer un objeto de respuesta elegante y devolverlo, y luego dejar que el proceso de la página se ejecute, ya que borrará los encabezados de CORS y continuará con el contenido habitual.
App::before(function($request)
{
if ($_SERVER[''REQUEST_METHOD''] === ''OPTIONS'') {
header(''Access-Control-Allow-Origin'', ''http://mydomain.com'');
header(''Allow'', ''GET, POST, OPTIONS'');
header(''Access-Control-Allow-Headers'', ''Origin, Content-Type, Accept, Authorization, X-Request-With'');
header(''Access-Control-Allow-Credentials'', ''true'');
exit;
}
});