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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-03 02:22:03626parcourir

Why am I still getting an

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn