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ürAccess-Control-Allow-Headers
nicht zulässig.
Was fehlt mir?
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).
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!";
}
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");
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);
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
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
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");
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: *");
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");