190 votes

Cross-Origin Request Headers (CORS) avec les en-têtes PHP

J'ai un simple script PHP pour lequel je tente une requête CORS inter-domaine :

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

Pourtant, je reçois toujours l'erreur :

Champ d'en-tête de la demande X-Requested-With n'est pas autorisé par Access-Control-Allow-Headers

Il y a quelque chose que j'ai manqué ?

22voto

Finn Johansen Points 201

Si vous voulez créer un service CORS à partir de PHP, vous pouvez utiliser ce code comme première étape de votre fichier qui traite 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

0 votes

Cela résout mon problème - apparemment mon webservice PHP n'est pas capable de recevoir correctement les requêtes OPTIONS - sur lesquelles mon front-end Angular s'appuie avant d'envoyer la requête POST. Merci !

13voto

shades3002 Points 192

CORS peut devenir un casse-tête, si l'on ne comprend pas correctement son fonctionnement. Je les utilise en PHP et ils fonctionnent sans problème. 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");

0 votes

J'ai utilisé cette méthode dans Codeigniter 4.1.3 et elle ne fonctionne pas.

10voto

Labib Hussain Points 252

Cette quantité de code fonctionne pour moi lorsque j'utilise Angular 4 comme côté client et PHP comme côté serveur.

header("Access-Control-Allow-Origin: *");

0 votes

Soyez prudent lorsque vous utilisez le caractère générique '*'. Ne l'ouvrez jamais, sauf si c'est ce que vous avez vraiment l'intention de faire. Quant aux tests de votre application angulaire, spécifiez localhost:4200 et ça marchera tout en étant plus sûr.

8voto

user8453321 Points 69

Cela devrait fonctionner

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

0voto

Rakyesh Kadadas Points 101

Ajouter ce code dans .htaccess

ajoutez des clés d'authentification personnalisées dans l'en-tête, comme app_key, auth_key, etc.

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X