Ich habe einen grundlegenden RESTful-Dienst mit dem SLIM-PHP-Framework erstellt und versuche jetzt, ihn so zu verkabeln, dass ich von einem Angular.js-Projekt aus auf den Dienst zugreifen kann. Ich habe gelesen, dass Angular CORS standardmäßig unterstützt, und ich musste nur diese Zeile hinzufügen: Header set Access-Control-Allow-Origin "*" zu meiner .htaccess-Datei.
Ich habe dies getan und meine REST-Anwendung funktioniert immer noch (kein 500-interner Serverfehler von einem fehlerhaften .htaccess), aber wenn ich versuche, es zu testen, funktioniert es immer noch test-cors.org es wirft einen Fehler.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [QSA,L]
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Muss ich meiner .htaccess-Datei noch etwas hinzufügen, damit dies ordnungsgemäß funktioniert, oder gibt es eine andere Möglichkeit, CORS auf meinem Server zu aktivieren?
Devin Crossmann
Da ich sowieso alles an index.php weitergeleitet hatte, dachte ich, ich wĂĽrde versuchen, die Header in PHP anstelle der .htaccess-Datei zu setzen, und es hat funktioniert! YAY! Hier ist, was ich zu index.php fĂĽr alle anderen hinzugefĂĽgt habe, die dieses Problem haben.
// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
// should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
// whitelist of safe domains
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']))
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}
Die Antwort auf diese Frage geht an Slashingweapon
Da ich Slim verwende, habe ich diese Route hinzugefĂĽgt, damit OPTIONS-Anfragen eine HTTP 200-Antwort erhalten
Du hast bisher vier Leben gerettet, obwohl ich dachte, ich brauche es nur header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); . Danke !
– raph77777
10. Oktober 2016 um 16:58 Uhr
Nachdem ich die andere Antwort überprüft habe, habe ich Bedenken hinsichtlich Ihrer Lösung. Der Autor slashingweapon fügte einen von Ihnen entfernten Kommentar hinzu, der Sie dazu aufforderte, eine Logik hinzuzufügen, um zu entscheiden, ob der Ursprung ein vertrauenswürdiger Ursprung war. Hier haben Sie es blind entfernt und jeden Ursprung akzeptiert. Keine gute Praxis.
– Jo
15. Juni 2018 um 22:18 Uhr
@ Joe guter Punkt. Ich habe die Antwort mit einem Kommentar zur ĂśberprĂĽfung des Ursprungs aktualisiert
– Devin Crossmann
16. Juni 2018 um 0:00 Uhr
Sollte das nicht .htaccess verwenden add anstatt set?
Danke! das hat mein Problem gelöst! Ich benutzte set und es hat nicht funktioniert, das Ändern mit add hat es behoben. Für das, was es wert ist, wurde dies auf einem WordPress-Blog gemacht, mit einigen anderen Dingen in der .htaccess-Datei
Ich habe von set zu add geändert und erhalte immer noch Response for preflight has invalid HTTP status code 400 ..bitte vorschlagen ..habe meinen vollständigen Beitrag hier beschrieben: magento.stackexchange.com/questions/170342/…
– Sushivam
16. April 2017 um 6:02 Uhr
Mir hat die erste Zeile gereicht. AuĂźerdem denke ich, dass die zweite Zeile keinen Doppelpunkt haben sollte?
Wie in dieser Antwort können Sie benutzerdefinierten HTTP-Header für eine bestimmte Datei verwenden <File> So aktivieren Sie CORS für eine einzelne Datei mit diesem Code:
<Files "index.php">
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
</Files>
Anstatt "*" Sie können einen bestimmten Ursprung angeben (Protokoll + Domäne + optionaler Port).
Levin
Wird zu 100% funktionieren, bewerben Sie sich in .htaccess:
# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(1xyz\.com|2xyz\.com)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"
# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
Ich möchte nur hinzufügen, dass es notwendig ist, die SetEnvIf-Anweisung zu bearbeiten, die definiert, welche Fernbedienungen (1xyz.com, 2xyz.com) CORS-Zugriff haben.
– Benutzer1298923
15. Oktober 2019 um 17:30 Uhr
Santanu Brahma
Es sieht so aus, als ob Sie eine alte Version von slim(2.x) verwenden. Sie können einfach die folgenden Zeilen zu .htaccess hinzufügen und müssen nichts in PHP-Skripten tun.
# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(domain_one\.com|domain_two\.net)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE"
Header always set Access-Control-Allow-Headers: Authorization
# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
Ich möchte nur hinzufügen, dass es notwendig ist, die SetEnvIf-Anweisung zu bearbeiten, die definiert, welche Fernbedienungen (1xyz.com, 2xyz.com) CORS-Zugriff haben.
– Benutzer1298923
15. Oktober 2019 um 17:30 Uhr
Jakow L
Dank Devin habe ich die Lösung für meine SLIM-Anwendung mit Multi-Domain-Zugriff gefunden.
Im htaccess:
SetEnvIf Origin "http(s)?://(www\.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true
in index.php
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}
// instead of mapping:
$app->options('/(:x+)', function() use ($app) {
//...return correct headers...
$app->response->setStatus(200);
});
9171000cookie-checkaktivieren Sie cors in .htaccessyes