origin habilitar control chrome allow php javascript xmlhttprequest cors

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 por Access-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).