wake-up-neo.com

CORS mit PHP-Headern

Ich habe ein einfaches PHP -Skript, mit dem ich eine domänenübergreifende CORS-Anforderung versuche:

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

Trotzdem bekomme ich immer noch den Fehler:

Das Anforderungsheaderfeld X-Requested-With ist für Access-Control-Allow-Headers nicht zulässig.

Was fehlt mir?

105
user1022241

Access-Control-Allow-Headers erlaubt * nicht als akzeptierten Wert, siehe Mozilla-Dokumentation hier .

Anstelle des Sterns sollten Sie die akzeptierten Header senden (zuerst X-Requested-With, wie der Fehler besagt).

45
KARASZI István

Die korrekte Bearbeitung von CORS-Anfragen ist etwas komplizierter. Hier ist eine Funktion, die vollständiger (und korrekter) reagiert.

/**
 *  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!";
}
240
slashingweapon

Ich habe den gleichen Fehler erhalten und ihn mit folgendem PHP in meinem Backend-Skript behoben:

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

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

header("Access-Control-Allow-Headers: X-Requested-With");
30
Fiach Reid

Viele Beschreibungen im Internet erwähnen nicht, dass die Angabe von Access-Control-Allow-Origin nicht ausreicht. Hier ist ein vollständiges Beispiel, das für mich funktioniert:

<?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);
18
Csongor Halmai

Ich habe es einfach geschafft, Dropzone und anderes Plugin für diesen Fix zu bekommen (Anglejs + 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');

fügen Sie dies in Ihre upload.php-Datei oder in das Verzeichnis ein, an das Sie Ihre Anfrage senden würden (wenn Sie zum Beispiel upload.html haben und die Dateien an upload.php anhängen müssen, kopieren Sie diese 4 Zeilen und fügen Sie sie ein) ..__ Verwenden Sie CORS-Plugins/Addons in Chrome/Mozilla. Schalten Sie sie mehrmals um, damit CORS aktiviert wird

13
Fedeco

Wenn Sie aus PHP einen CORS-Dienst erstellen möchten, können Sie diesen Code als ersten Schritt in Ihrer Datei verwenden, der die Anforderungen verarbeitet:

// 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
9
Finn Johansen

CORS kann Kopfschmerzen verursachen, wenn wir seine Funktionsweise nicht richtig verstehen. Ich verwende sie in PHP und sie funktionieren ohne Probleme. Verweis hier

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");
6
shades3002

Bei der Verwendung von angle 4 als Client-Seite und PHP als Server-Seite funktioniert dieser Code für mich nicht.

header ("Zugriffskontrolle-Zulassen-Ursprung: *");

1
Labib Hus'sain

das sollte funktionieren

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