Ich habe einen grundlegenden RESTful-Dienst mit dem SLIM PHP-Framework erstellt und versuche nun, ihn so zu verkabeln, dass ich von einem Angular.js-Projekt aus auf den Dienst zugreifen kann. Ich habe gelesen, dass Angular CORS sofort unterstützt, und alles, was ich tun musste, war diese Zeile hinzuzufügen: Header set Access-Control-Allow-Origin "*"
zu meiner .htaccess-Datei.
Ich habe dies getan und meine REST-Anwendung funktioniert immer noch (kein Fehler von 500 internen Servern aufgrund eines fehlerhaften .htaccess), aber wenn ich versuche, sie von test-cors.org zu testen , wird ein Fehler ausgegeben .
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 meinem .htaccess noch etwas hinzufügen, damit dies ordnungsgemäß funktioniert, oder gibt es eine andere Möglichkeit, CORS auf meinem Server zu aktivieren?
Antworten:
Da ich sowieso alles an index.php weiterleiten ließ, dachte ich, ich würde versuchen, die Header in PHP anstelle der .htaccess-Datei zu setzen, und es funktionierte! YAY! Folgendes habe ich zu index.php hinzugefügt, damit alle anderen 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']}"); }
Dank geht an slashingweapon für seine Antwort auf diese Frage
Da ich Slim verwende, habe ich diese Route hinzugefügt, damit OPTIONS-Anforderungen eine HTTP 200-Antwort erhalten
// return HTTP 200 for HTTP OPTIONS requests $app->map('/:x+', function($x) { http_response_code(200); })->via('OPTIONS');
quelle
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
. Vielen Dank !Sollte nicht die
.htaccess
Verwendungadd
stattset
?Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
quelle
set
und es hat nicht funktioniert. Es wurde durch Hinzufügen geändert und behoben. Für das, was es wert ist, wurde dies auf einem WordPress-Blog gemacht, mit einigen anderen Sachen in der .htaccess-DateiDas 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"
quelle
Wie in dieser Antwort Benutzerdefinierter HTTP-Header für eine bestimmte Datei können Sie
<File>
CORS für eine einzelne Datei mit diesem Code aktivieren:<Files "index.php"> Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" </Files>
quelle
# 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]
quelle
Es sieht so aus, als würden Sie eine alte Version von slim (2.x) verwenden. Sie können .htaccess einfach die folgenden Zeilen hinzufügen und müssen in PHP-Skripten nichts 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]
quelle
Dank Devin habe ich die Lösung für meine SLIM-Anwendung mit Multi-Domain-Zugriff gefunden.
In 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); });
quelle
Ich habe die @ abimelex-Lösung ausprobiert, aber in Slim 3.0 sieht die Zuordnung der OPTIONS-Anforderungen folgendermaßen aus:
$app = new \Slim\App(); $app->options('/books/{id}', function ($request, $response, $args) { // Return response headers });
https://www.slimframework.com/docs/objects/router.html#options-route
quelle