Ich verwende Laravel 5.4 und leider machen, obwohl scheint die akzeptierte Antwort in Ordnung, für Preflight-Anforderungen (wie PUT
und DELETE
), die durch eine vorangehen wird OPTIONS
Anfrage, Angabe der Middleware in der $routeMiddleware
Array (und mit dieser in der Routen Definitionsdatei) funktioniert nicht, es sei denn, Sie definieren auch eine Route-Handler für OPTIONS
. Dies ist, weil ohne OPTIONS
Route Laravel internally respond zu dieser Methode ohne die CORS-Header.
Also kurz gesagt entweder die Middleware in den $middleware
Array definieren, die für alle Anforderungen global läuft oder wenn Sie es in $middlewareGroups
oder $routeMiddleware
tun dann auch eine Route Handler für OPTIONS
definieren.Dies kann wie folgt geschehen:
Route::match(['options', 'put'], '/route', function() {
// This will work with the middleware shown in the accepted answer
})->middleware('cors');
ich auch eine Middleware für den gleichen Zweck schrieb, das ähnlich aussieht, aber größer, da es versucht, mehr konfigurierbar zu sein und übernimmt eine Reihe von Bedingungen auch:
<?php
namespace App\Http\Middleware;
use Closure;
class Cors
{
private static $allowedOriginsWhitelist = [
'http://localhost:8000'
];
// All the headers must be a string
private static $allowedOrigin = '*';
private static $allowedMethods = 'OPTIONS, GET, POST, PUT, PATCH, DELETE';
private static $allowCredentials = 'true';
private static $allowedHeaders = '';
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (! $this->isCorsRequest($request))
{
return $next($request);
}
static::$allowedOrigin = $this->resolveAllowedOrigin($request);
static::$allowedHeaders = $this->resolveAllowedHeaders($request);
$headers = [
'Access-Control-Allow-Origin' => static::$allowedOrigin,
'Access-Control-Allow-Methods' => static::$allowedMethods,
'Access-Control-Allow-Headers' => static::$allowedHeaders,
'Access-Control-Allow-Credentials' => static::$allowCredentials,
];
// For preflighted requests
if ($request->getMethod() === 'OPTIONS')
{
return response('', 200)->withHeaders($headers);
}
$response = $next($request)->withHeaders($headers);
return $response;
}
/**
* Incoming request is a CORS request if the Origin
* header is set and Origin !== Host
*
* @param \Illuminate\Http\Request $request
*/
private function isCorsRequest($request)
{
$requestHasOrigin = $request->headers->has('Origin');
if ($requestHasOrigin)
{
$origin = $request->headers->get('Origin');
$host = $request->getSchemeAndHttpHost();
if ($origin !== $host)
{
return true;
}
}
return false;
}
/**
* Dynamic resolution of allowed origin since we can't
* pass multiple domains to the header. The appropriate
* domain is set in the Access-Control-Allow-Origin header
* only if it is present in the whitelist.
*
* @param \Illuminate\Http\Request $request
*/
private function resolveAllowedOrigin($request)
{
$allowedOrigin = static::$allowedOrigin;
// If origin is in our $allowedOriginsWhitelist
// then we send that in Access-Control-Allow-Origin
$origin = $request->headers->get('Origin');
if (in_array($origin, static::$allowedOriginsWhitelist))
{
$allowedOrigin = $origin;
}
return $allowedOrigin;
}
/**
* Take the incoming client request headers
* and return. Will be used to pass in Access-Control-Allow-Headers
*
* @param \Illuminate\Http\Request $request
*/
private function resolveAllowedHeaders($request)
{
$allowedHeaders = $request->headers->get('Access-Control-Request-Headers');
return $allowedHeaders;
}
}
Auch eine blog post auf diese geschrieben.
Barryvdhs ist für Laravel 5, und wirklich sollte es aus der Box mit 5.1 auch funktionieren. Hast Du es versucht? – Dencker
Ja, ich habe versucht, aber ich bekomme immer noch die folgende Nachricht (es ist ein eckiges Frontend) XMLHttpRequest kann http://api.address.com nicht laden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'http://127.0.0.1:8080' ist daher nicht erlaubt. Aber ich habe hinzugefügt, die bereits die lokale Adresse auf den cors Dateien 'supportsCredentials' => true, 'allowedOrigins' => [ 'http://127.0.0.1:8080'], 'allowedHeaders' => [ '*'], 'allowedMethods' => ['GET', 'POST', 'PUT', 'LÖSCHEN'], 'exposedHeaders' => [], 'maxAge' => 0, 'Hosts' => [], –
Welche Nachricht erhalten Sie? – Dencker