php - habilitar - jquery cors
CORS con encabezados php (9)
CORS puede convertirse en un dolor de cabeza si no comprendemos correctamente su funcionamiento. Los uso en PHP y funcionan sin problemas. referencia aquí
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");
Tengo un script PHP simple que estoy intentando una solicitud CORS entre dominios:
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...
Sin embargo, sigo teniendo el error:
El campo de encabezado de solicitud
X-Requested-With
no está permitido porAccess-Control-Allow-Headers
¿Algo que me falta?
Este código me funciona cuando uso angular 4 como cliente y PHP como servidor.
encabezado ("Access-Control-Allow-Origin: *");
Esto debería funcionar
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
Manejar apropiadamente las solicitudes de CORS es un poco más complicado. Aquí hay una función que responderá más completamente (y correctamente).
/**
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any
* origin.
*
* In a production environment, you probably want to be more restrictive, but this gives you
* the general idea of what is involved. For the nitty-gritty low-down, read:
*
* - https://developer.mozilla.org/en/HTTP_access_control
* - http://www.w3.org/TR/cors/
*
*/
function cors() {
// Allow from any origin
if (isset($_SERVER[''HTTP_ORIGIN''])) {
// Decide if the origin in $_SERVER[''HTTP_ORIGIN''] is one
// you want to allow, and if so:
header("Access-Control-Allow-Origin: {$_SERVER[''HTTP_ORIGIN'']}");
header(''Access-Control-Allow-Credentials: true'');
header(''Access-Control-Max-Age: 86400''); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER[''REQUEST_METHOD''] == ''OPTIONS'') {
if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_METHOD'']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS'']))
header("Access-Control-Allow-Headers: {$_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS'']}");
exit(0);
}
echo "You have CORS!";
}
Muchas descripciones en Internet no mencionan que especificar Access-Control-Allow-Origin
no es suficiente. Aquí hay un ejemplo completo que funciona para mí:
<?php
if ($_SERVER[''REQUEST_METHOD''] === ''OPTIONS'') {
header(''Access-Control-Allow-Origin: *'');
header(''Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS'');
header(''Access-Control-Allow-Headers: token, Content-Type'');
header(''Access-Control-Max-Age: 1728000'');
header(''Content-Length: 0'');
header(''Content-Type: text/plain'');
die();
}
header(''Access-Control-Allow-Origin: *'');
header(''Content-Type: application/json'');
$ret = [
''result'' => ''OK'',
];
print json_encode($ret);
Obtuve el mismo error y lo solucioné con el siguiente PHP en mi script de back-end:
header(''Access-Control-Allow-Origin: *'');
header(''Access-Control-Allow-Methods: GET, POST'');
header("Access-Control-Allow-Headers: X-Requested-With");
Si desea crear un servicio CORS desde PHP, puede usar este código como primer paso en su archivo que maneja las solicitudes:
// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
// You can decide if the origin in $_SERVER[''HTTP_ORIGIN''] is something you want to allow, or as we do here, just allow all
header("Access-Control-Allow-Origin: {$_SERVER[''HTTP_ORIGIN'']}");
}
else
{
//No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
header("Access-Control-Allow-Origin: *");
}
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600"); // cache for 10 minutes
if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support
if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
header("Access-Control-Allow-Headers: {$_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS'']}");
//Just exit with 200 OK with the above headers for OPTIONS method
exit(0);
}
//From here, handle the request as it is ok
Simplemente logré que Dropzone y otros complementos funcionen con esta corrección (angularjs + php backend)
header(''Access-Control-Allow-Origin: *'');
header("Access-Control-Allow-Credentials: true");
header(''Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'');
header(''Access-Control-Max-Age: 1000'');
header(''Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization'');
agréguelo a su archivo upload.php o al lugar donde enviaría su solicitud (por ejemplo, si tiene upload.html y necesita adjuntar los archivos a upload.php, luego copie y pegue estas 4 líneas). Además, si utiliza complementos / complementos de CORS en chrome / mozilla, asegúrese de alternarlos más de una vez, para que CORS esté habilitado.
Access-Control-Allow-Headers
no permite *
como valor aceptado, consulte la documentación de Mozilla here .
En lugar del asterisco, debe enviar los encabezados aceptados (primero X-Requested-With
como dice el error).