
Devin Crossmann
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.
Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error
XHR status: 0
XHR status text:
Fired XHR event: loadend
Meine .htaccess-Datei sieht so aus
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
// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
http_response_code(200);
})->via('OPTIONS');
Sollte das nicht .htaccess
verwenden add
anstatt set
?
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

Jack Leon
Das hat bei mir funktioniert:
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

jkubisch
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]

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]

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