Maison > Article > développement back-end > Pourquoi est-ce que je reçois toujours une erreur « Access-Control-Allow-Origin » lorsque j'ai défini les en-têtes CORS en PHP ?
CORS ne fonctionne pas en PHP
Le partage de ressources d'origine croisée (CORS) vous permet d'effectuer des requêtes d'un domaine vers un domaine différent. Lorsqu'une requête est effectuée à partir d'un domaine différent, le navigateur vérifie dans la réponse du serveur les en-têtes spécifiques indiquant si la requête est autorisée.
Problème :
Un développeur tente d'envoyer une requête POST de www.siteone.com à www.sitetwo.com en utilisant CORS. Cependant, ils rencontrent une « erreur Access-control-Allow-Origin » malgré la définition des en-têtes CORS nécessaires sur le serveur.
En-têtes de requête/réponse :
Response Headers Connection Keep-Alive Content-Length 487 Content-Type text/html; charset=iso-8859-1 Date Fri, 23 Aug 2013 05:53:20 GMT Keep-Alive timeout=15, max=99 Server Apache/2.2.15 (CentOS) WWW-Authenticate Basic realm="Site two Server - Restricted Area" Request Headers Accept */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 43 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host www.sitetwo.com Origin http://www.siteone.com Referer http://www.siteone.com/index.html User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Solution :
Le problème réside dans la façon dont les en-têtes CORS sont définis sur le serveur. Le code d'origine utilisait une approche simplifiée qui incluait uniquement les en-têtes suivants :
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
Cependant, selon la spécification CORS, le traitement correct des requêtes nécessite une approche plus globale. Le développeur a mis à jour le code comme suit :
if (isset($_SERVER['HTTP_ORIGIN'])) { header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 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); } // Your actual code goes here echo "You have CORS!";
Ce code mis à jour définit non seulement les en-têtes CORS de base, mais gère également les requêtes OPTIONS de contrôle en amont, qui sont utilisées par les navigateurs pour déterminer si la requête réelle est autorisée. En mettant en œuvre cette approche plus approfondie, le développeur a réussi à activer CORS pour son application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!