CORS avec des en-têtes php

j'ai un script PHP simple que je tente une requête cross-domain CORS:

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

pourtant j'obtiens toujours l'erreur:

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

quelque chose qui me manque?

89
demandé sur rink.attendant.6 2012-01-04 02:03:56

9 réponses

Access-Control-Allow-Headers ne pas autoriser * comme valeur acceptée, voir la Mozilla Documentation ici .

au lieu de l'astérisque, vous devez envoyer les en-têtes acceptés (d'abord X-Requested-With comme l'erreur dit).

42
répondu KARASZI István 2018-05-29 10:34:22

le fait de traiter correctement les demandes du CORS est un peu plus complexe. Voici une fonction qui répondra plus pleinement (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!";
}
219
répondu slashingweapon 2017-01-16 07:21:13

j'ai eu la même erreur, et je l'ai corrigée avec le PHP suivant dans mon script back-end:

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

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");
26
répondu Fiach Reid 2018-05-30 20:43:21

de nombreuses descriptions sur internet ne mentionnent pas qu'il ne suffit pas de spécifier Access-Control-Allow-Origin . 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);
11
répondu Csongor Halmai 2017-07-26 14:23:50

j'ai tout simplement réussi à faire fonctionner dropzone et d'autres plugins 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 téléchargement.php ou où vous voulez envoyer votre demande (par exemple, si vous avez télécharger.html et vous devez joindre les fichiers à télécharger.php, puis copier et coller ces 4 lignes). Aussi si vous utilisez des plugins CORS / addons dans chrome / mozilla assurez-vous de les basculer plus d'une fois,afin que CORS soit activé

9
répondu Fedeco 2016-11-23 15:52:57

si vous voulez créer un service CORS à partir de PHP, vous pouvez utiliser ce code comme première étape dans votre fichier qui traite les requêtes:

// 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
7
répondu Finn Johansen 2017-04-19 14:15:01

CORS peut devenir un mal de tête, si nous ne comprenons 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");
4
répondu shades3002 2017-06-13 19:24:38

ce code fonctionne pour moi quand j'utilise angular 4 comme côté client et PHP comme côté serveur.

en-tête ("Access-Control-Allow-Origin:*");

1
répondu Labib Hus'sain 2017-12-14 09:45:27

ça 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");
1
répondu user8453321 2018-06-19 00:31:35