J'ai un simple script PHP selon lequel je tente une requête CORS entre domaines
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...
Pourtant, j'ai toujours l'erreur:
Le champ d'en-tête de requête
X-Requested-With
n'est pas autorisé parAccess-Control-Allow-Headers
Quelque chose me manque?
Access-Control-Allow-Headers
n'autorise pas *
en tant que valeur acceptée, voir la documentation de Mozilla ici .
Au lieu de l'astérisque, vous devez envoyer les en-têtes acceptés (le premier X-Requested-With
comme l'indique l'erreur).
Le traitement correct des demandes CORS est un peu plus complexe. Voici une fonction qui répondra plus complètement (et correctement).
/**
* 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!";
}
J'ai la même erreur et je l'ai corrigé avec le texte suivant PHP dans mon script principal:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
Beaucoup de descriptions sur Internet ne mentionnent pas que spécifier Access-Control-Allow-Origin
n'est pas suffisant. Voici un exemple complet qui fonctionne pour moi:
<?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);
J'ai simplement réussi à faire en sorte que dropzone et d'autres plugins fonctionnent avec ce correctif (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');
ajoutez ceci dans votre fichier upload.php ou à l'endroit où vous enverriez votre demande (par exemple, si vous avez upload.html et que vous devez joindre les fichiers à upload.php, puis copiez et collez ces 4 lignes) . utilisez des plug-ins/addons CORS en chrome/mozilla, assurez-vous de les activer plusieurs fois, afin que CORS soit activé
Si vous souhaitez créer un service CORS à partir de PHP, vous pouvez utiliser ce code comme première étape de votre fichier pour gérer les demandes:
// 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
CORS peut devenir un mal de tête si nous ne comprenons pas correctement son fonctionnement. Je les utilise dans PHP et ils fonctionnent sans problèmes. référence ici
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");
Cette quantité de code fonctionne pour moi lorsque angular 4 est utilisé du côté client et PHP du côté serveur.
en-tête ("Access-Control-Allow-Origin: *");
cela devrait marcher
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");