Implementiert https://github.com/fruitcake/php-cors für Laravel
Seit Laravel 9.2 ist diese Middleware in Laravel/Framework enthalten. Sie können die bereitgestellte Middleware verwenden, die mit der in diesem Paket bereitgestellten Middleware und Konfiguration kompatibel sein sollte. Die Änderungen finden Sie unter https://github.com/laravel/laravel/pull/5825/files.
Schritte zum Upgrade:
Entfernen Sie "fruitcake/laravel-cors"
aus Ihrer Composer.json
Ersetzen Sie FruitcakeCorsHandleCors::class,
durch IlluminateHttpMiddlewareHandleCors::class,
in app/Http/Kernel.php
Weitere Informationen zur erweiterten Verwendung finden Sie https://github.com/fruitcake/php-cors
. Die Konfiguration bleibt gleich.
Mit dem Paket laravel-cors
können Sie Cross-Origin Resource Sharing-Header mit der Laravel-Middleware-Konfiguration senden.
Wenn Sie einen globalen Überblick über den CORS-Workflow erhalten möchten, können Sie dieses Bild durchsuchen.
Beim Upgrade von 0.x-Versionen gibt es einige wichtige Änderungen:
Eine neue „paths“-Eigenschaft wird verwendet, um CORS auf bestimmten Routen zu aktivieren/deaktivieren. Dies ist standardmäßig leer, also füllen Sie es richtig aus!
Gruppen-Middleware wird nicht mehr unterstützt. Verwenden Sie die globale Middleware
Der Herstellername hat sich geändert (siehe Installation/Nutzung)
Die Groß-/Kleinschreibung der Requisiten in cors.php
hat sich von „camelCase“ in „snake_case“ geändert. Wenn Sie also bereits über eine cors.php
-Datei verfügen, müssen Sie die darin enthaltenen Requisiten aktualisieren, damit sie mit der neuen Groß-/Kleinschreibung übereinstimmen.
Verarbeitet CORS-OPTIONEN-Anfragen vor dem Flug
Fügt Ihren Antworten CORS-Header hinzu
Passen Sie Routen an, um CORS nur zu bestimmten Anfragen hinzuzufügen
Fordern Sie das Paket fruitcake/laravel-cors
in Ihrer composer.json
an und aktualisieren Sie Ihre Abhängigkeiten:
Komponist benötigt Fruitcake/Laravel-Cors
Wenn ein Konflikt auftritt, kann dies daran liegen, dass eine ältere Version von barryvdh/laravel-cors oder Fruitcake/laravel-cors installiert ist. Entfernen Sie zuerst das in Konflikt stehende Paket und versuchen Sie dann erneut, es zu installieren:
Komponist entfernen barryvdh/laravel-cors Fruitcake/laravel-cors Komponist benötigt Fruitcake/Laravel-Cors
Um CORS für alle Ihre Routen zuzulassen, fügen Sie die HandleCors
Middleware oben in der Eigenschaft $middleware
der Klasse app/Http/Kernel.php
hinzu:
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
Aktualisieren Sie nun die Konfiguration, um die Pfade zu definieren, auf denen Sie den CORS-Dienst ausführen möchten (siehe Konfiguration unten):
'paths' => ['api/*'],
Die Standardeinstellungen werden in config/cors.php
festgelegt. Veröffentlichen Sie die Konfiguration, um die Datei in Ihre eigene Konfiguration zu kopieren:
PHP-Artist-Anbieter:publish --tag="cors"
Hinweis: Wenn Sie benutzerdefinierte Header wie
X-Auth-Token
oderX-Requested-With
verwenden, müssen Sieallowed_headers
so festlegen, dass diese Header enthalten sind. Sie können es auch auf['*']
setzen, um alle benutzerdefinierten Header zuzulassen.
Hinweis: Wenn Sie Header explizit auf die Whitelist setzen, müssen Sie
Origin
einbeziehen, sonst werden Anfragen nicht als CORS erkannt.
Option | Beschreibung | Standardwert |
---|---|---|
Wege | Sie können CORS für einen oder mehrere Pfade aktivieren, z. ['api/*'] | [] |
erlaubte_Methoden | Entspricht der Anforderungsmethode. | ['*'] |
erlaubte_Ursprünge | Entspricht dem Anforderungsursprung. Es können Platzhalter verwendet werden, z. *.mydomain.com oder mydomain.com:* | ['*'] |
erlaubte_origins_patterns | Entspricht dem Anforderungsursprung mit preg_match . | [] |
erlaubte_Header | Legt den Antwortheader „Access-Control-Allow-Headers“ fest. | ['*'] |
exponierte_header | Legt den Antwortheader „Access-Control-Expose-Headers“ fest. | [] |
max_age | Legt den Antwortheader „Access-Control-Max-Age“ fest. | 0 |
unterstützt_credentials | Legt den Header „Access-Control-Allow-Credentials“ fest. | false |
allowed_origins
, allowed_headers
und allowed_methods
können auf ['*']
gesetzt werden, um jeden Wert zu akzeptieren.
Hinweis: Für
allowed_origins
müssen Sie das Schema einschließen, wenn Sie keinen Platzhalter verwenden, z. B.['http://example.com', 'https://example.com']
. Sie müssen auch berücksichtigen, dass das Schema vorhanden ist, wenn Sieallowed_origins_patterns
verwenden.
Hinweis: Versuchen Sie, so genau wie möglich zu sein. Sie können die Entwicklung mit lockeren Einschränkungen beginnen, aber es ist besser, so streng wie möglich zu sein!
Hinweis: Aufgrund der Überschreibung von HTTP-Methoden in Laravel können API-Benutzer durch das Zulassen von POST-Methoden auch PUT- und DELETE-Anfragen ausführen.
Hinweis: Manchmal ist es notwendig, den Port anzugeben (z. B. wenn Sie Ihre App in einer lokalen Umgebung programmieren) . Sie können hier auch den Port angeben oder einen Platzhalter verwenden, z.
localhost:3000
,localhost:*
oder sogar die Verwendung eines FQDNapp.mydomain.com:8080
Registrieren Sie auf Lumen einfach den ServiceProvider manuell in Ihrer bootstrap/app.php
Datei:
$app->register(FruitcakeCorsCorsServiceProvider::class);
Kopieren Sie außerdem die Konfigurationsdatei cors.php nach config/cors.php
und setzen Sie sie in die Tat um:
$app->configure('cors');
Um CORS für alle Ihre Routen zuzulassen, fügen Sie die HandleCors
Middleware zur globalen Middleware hinzu und legen Sie die paths
Eigenschaft in der Konfiguration fest.
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
Stellen Sie sicher, dass die path
in der Konfiguration korrekt ist und tatsächlich mit der von Ihnen verwendeten Route übereinstimmt. Denken Sie daran, auch den Konfigurationscache zu leeren.
Manchmal können Fehler/Middleware, die eigene Antworten zurückgeben, die Ausführung der CORS-Middleware verhindern. Versuchen Sie, die Reihenfolge der Middleware zu ändern und stellen Sie sicher, dass es sich um den ersten Eintrag in der globalen Middleware und nicht um eine Routengruppe handelt. Überprüfen Sie Ihre Protokolle auch auf tatsächliche Fehler, denn ohne CORS werden die Fehler vom Browser verschluckt und nur CORS-Fehler angezeigt. Versuchen Sie auch, es ohne CORS auszuführen, um sicherzustellen, dass es tatsächlich funktioniert.
Wenn Ihre Anfrage einen Autorisierungsheader enthält oder den Anmeldeinformationsmodus verwendet, legen Sie den Wert supports_credentials
in der Konfiguration auf „true“ fest. Dadurch wird der Access-Control-Allow-Credentials-Header auf true
gesetzt.
Wenn Sie echo()
, dd()
, die()
, exit()
, dump()
usw. in Ihrem Code verwenden, unterbrechen Sie den Middleware-Fluss. Wenn die Ausgabe vor Headern gesendet wird, kann CORS nicht hinzugefügt werden. Wenn das Skript beendet wird, bevor die CORS-Middleware fertig ist, werden keine CORS-Header hinzugefügt. Geben Sie immer eine ordnungsgemäße Antwort zurück oder lösen Sie eine Ausnahme aus.
Verwenden Sie nach Möglichkeit eine Routengruppe mit deaktiviertem CSRF-Schutz. Andernfalls können Sie CSRF für bestimmte Anforderungen in AppHttpMiddlewareVerifyCsrfToken
deaktivieren:
protected $exclusive = ['api/*','sub.domain.zone' => [ 'prefix/*'], ];
Die CORS-Middleware sollte der einzige Ort sein, an dem Sie diese Header hinzufügen. Wenn Sie auch Header in .htaccess, nginx oder Ihrer index.php-Datei hinzufügen, erhalten Sie doppelte Header und unerwartete Ergebnisse.
Wenn Sie keine Cross-Site-Anfragen durchführen, d. h. wenn Sie site-a.com/api nicht von site-b.com anfordern, sendet Ihr Browser den Anforderungsheader Origin: https://site-b.com
nicht. CORS wird „deaktiviert“, da auch der Header Access-Control-Allow-Origin
fehlt. Dies liegt daran, dass von dort aus Anfragen gesendet werden und in diesem Fall kein Schutz erforderlich ist.
Veröffentlicht unter der MIT-Lizenz, siehe LIZENZ.