Laravel 5.1 API Enable Cors
j'ai cherché quelques moyens d'activer le cors sur laravel 5.1 en particulier, j'ai trouvé quelques libs comme:
https://github.com/neomerx/cors-illuminate
https://github.com/barryvdh/laravel-cors
mais aucun d'eux N'a de tutoriel d'implémentation spécifique à Laravel 5.1, j'ai essayé de le configurer mais ça ne fonctionne pas.
si quelqu'un a déjà mis en œuvre CORS sur laravel 5.1 je serais reconnaissant pour le aider...
4 réponses
Voici mon middleware CORS:
<?php namespace App\Http\Middleware;
use Closure;
class CORS {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
header("Access-Control-Allow-Origin: *");
// ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
];
if($request->getMethod() == "OPTIONS") {
// The client-side application can set only headers allowed in Access-Control-Allow-Headers
return Response::make('OK', 200, $headers);
}
$response = $next($request);
foreach($headers as $key => $value)
$response->header($key, $value);
return $response;
}
}
pour utiliser CORS middleware, vous devez d'abord l'enregistrer dans votre app\Http\Kernel.fichier php comme ceci:
protected $routeMiddleware = [
//other middlewares
'cors' => 'App\Http\Middleware\CORS',
];
Ensuite, vous pouvez l'utiliser dans vos itinéraires
Route::get('example', array('middleware' => 'cors', 'uses' => 'ExampleController@dummy'));
j'utilise toujours une méthode facile. Juste ajouter ci-dessous les lignes \public\index.php
fichier. Tu n'es pas obligé d'utiliser un middleware, je pense.
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
J'utilise Laravel 5.4 et malheureusement bien que la réponse acceptée semble correcte, pour les requêtes préflightées (comme PUT
et DELETE
) qui sera précédé d'un OPTIONS
demande en spécifiant le middleware dans le $routeMiddleware
array (et en l'utilisant dans le parcours du fichier de définition) ne fonctionnera pas, sauf si vous définissez un itinéraire gestionnaire pour OPTIONS
. C'est parce que sans un OPTIONS
route Laravel sera répondre à l'interne à cette méthode sans les CORS tête.
en bref, définissez l'middleware dans le $middleware
tableau qui s'exécute globalement pour toutes les requêtes ou si vous le faites dans $middlewareGroups
ou $routeMiddleware
puis définissez aussi un gestionnaire de route pour OPTIONS
. Cela peut être fait comme ceci:
Route::match(['options', 'put'], '/route', function () {
// This will work with the middleware shown in the accepted answer
})->middleware('cors');
j'ai aussi écrit un middleware pour le même but qui semble similaire mais est plus grand en taille car il essaie d'être plus configurable et gère un tas de conditions aussi bien:
<?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;
}
}
Également écrit un blog sur ce.
barryvdh/laravel-scro fonctionne parfaitement avec Laravel 5.1 avec seulement quelques points clés de l'activation.
après l'avoir ajouté comme dépendance de compositeur, assurez-vous d'avoir publié le fichier de configuration CORS et ajusté les en-têtes CORS comme vous le souhaitez. Voici comment mine de regarder dans app/config / cors.php
<?php return [ 'supportsCredentials' => true, 'allowedOrigins' => ['*'], 'allowedHeaders' => ['*'], 'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE'], 'exposedHeaders' => ['DAV', 'content-length', 'Allow'], 'maxAge' => 86400, 'hosts' => [], ];
Après cela, il y a une étape de plus qui n'est pas mentionné dans la documentation, vous devez ajouter the CORS handler
'Barryvdh\Cors\HandleCors'
dans le noyau de L'application. Je préfère l'utiliser dans la pile middleware globale. Comme ceci/** * The application's global HTTP middleware stack. * * @var array */ protected $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', 'Illuminate\View\Middleware\ShareErrorsFromSession', 'Barryvdh\Cors\HandleCors', ];
mais c'est à vous de l'utiliser comme middleware de route et de placer sur des routes spécifiques.
cela devrait faire fonctionner le paquet avec L5.1