J'ai cherché des moyens d'activer cors sur laravel 5.1 en particulier, j'ai trouvé des bibliothèques telles que:
https://github.com/neomerx/cors-illuminate
https://github.com/barryvdh/laravel-cors
mais aucun d’entre eux n’a de didacticiel spécifique à Laravel 5.1, j’ai essayé de configurer mais cela ne fonctionne pas.
Si quelqu'un implémentait déjà CORS sur laravel 5.1, je vous serais reconnaissant de l'aide ...
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 le middleware CORS, vous devez d'abord l'enregistrer dans votre fichier app\Http\Kernel.php de la manière suivante:
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. Ajoutez simplement les lignes ci-dessous à \public\index.php
fichier. Vous n'êtes 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 demandes de contrôle en amont (comme PUT
et DELETE
), elles seront précédées d'un OPTIONS
request, spécifiant le middleware dans le $routeMiddleware
array (et son utilisation dans le fichier de définition des routes) ne fonctionnera que si vous définissez également un gestionnaire de route pour OPTIONS
. En effet, sans OPTIONS
route Laravel va répondre en interne à cette méthode sans les en-têtes CORS.
Bref, définissez le middleware dans le $middleware
tableau qui fonctionne globalement pour toutes les demandes ou si vous le faites dans $middlewareGroups
ou $routeMiddleware
définit alors également un gestionnaire d’itinéraires pour OPTIONS
. Cela peut être fait comme ça:
Route::match(['options', 'put'], '/route', function () {
// This will work with the middleware shown in the accepted answer
})->middleware('cors');
Dans le même but, j’ai également écrit un middleware similaire, mais de taille plus grande, car il essaie d’être plus configurable et gère un ensemble de conditions:
<?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 post à ce sujet.
barryvdh/laravel-cors fonctionne parfaitement avec Laravel 5.1 avec juste quelques points clés pour l'activer.
Après l’avoir ajouté en tant que dépendance composer), assurez-vous que vous avez publié le fichier de configuration CORS et ajusté les en-têtes CORS comme vous le souhaitez. Voici à quoi ressemble le mien 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 reste une étape non mentionnée dans la documentation, vous devez ajouter le gestionnaire CORS 'Barryvdh\Cors\HandleCors'
dans le noyau de l'application. Je préfère l'utiliser dans la pile de middleware globale. Comme ça
/**
* 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 d'itinéraires et de le placer sur des itinéraires spécifiques.
Cela devrait faire fonctionner le paquet avec L5.1