Laravel 5.1 API Enable Cors
Я искал некоторые способы включения cors на laravel 5.1 в частности, я нашел несколько таких библиотек, как:
https://github.com/neomerx/cors-illuminate
https://github.com/barryvdh/laravel-cors
но ни один из них не имеет учебника по внедрению специально для Laravel 5.1, я пытался настроить, но он не работает.
Если кто-то уже реализовал CORS на laravel 5.1, я был бы благодарен за помощь...
Ответы
Ответ 1
Вот мое промежуточное ПО 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;
}
}
Чтобы использовать промежуточное ПО CORS, вы должны сначала зарегистрировать его в файле app\Http\Kernel.php следующим образом:
protected $routeMiddleware = [
//other middlewares
'cors' => 'App\Http\Middleware\CORS',
];
Затем вы можете использовать его в своих маршрутах
Route::get('example', array('middleware' => 'cors', 'uses' => '[email protected]'));
Ответ 2
Я всегда использую простой метод. Просто добавьте строки ниже в файл \public\index.php
. Мне не нужно использовать промежуточное программное обеспечение.
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
Ответ 3
Я использую Laravel 5.4 и, к сожалению, хотя принятый ответ кажется нормальным, для предварительно $routeMiddleware
запросов (таких как PUT
и DELETE
), которым будет предшествовать запрос OPTIONS
, с указанием промежуточного программного обеспечения в массиве $routeMiddleware
(и использующего его в файле определения маршрутов) не будет работать, пока вы не определите обработчик маршрута для OPTIONS
. Это связано с тем, что без маршрута OPTIONS
Laravel будет внутренне отвечать на этот метод без заголовков CORS.
Короче говоря, либо определите промежуточное программное обеспечение в массиве $middleware
который выполняется глобально для всех запросов, либо, если вы делаете это в $middlewareGroups
или $routeMiddleware
то также определите обработчик маршрута для OPTIONS
. Это можно сделать так:
Route::match(['options', 'put'], '/route', function () {
// This will work with the middleware shown in the accepted answer
})->middleware('cors');
Я также написал промежуточное программное обеспечение для той же цели, которое выглядит схожим, но больше по размеру, так как оно пытается быть более настраиваемым и обрабатывает множество условий:
<?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;
}
}
Также написано в блоге об этом.
Ответ 4
barryvdh/laravel-cors отлично работает с Laravel 5.1 с несколькими ключевыми моментами в его включении.
-
После добавления в качестве зависимости композитора убедитесь, что вы опубликовали файл конфигурации CORS и скорректировали заголовки CORS, как вы того захотите. Вот как мой взгляд в app/config/cors.php
<?php
return [
'supportsCredentials' => true,
'allowedOrigins' => ['*'],
'allowedHeaders' => ['*'],
'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE'],
'exposedHeaders' => ['DAV', 'content-length', 'Allow'],
'maxAge' => 86400,
'hosts' => [],
];
-
После этого есть еще один шаг, который не упоминается в документации, вам нужно добавить обработчик CORS 'Barryvdh\Cors\HandleCors'
в ядро приложения. Я предпочитаю использовать его в глобальном стеке промежуточного программного обеспечения. Как этот
/**
* The application 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',
];
Но это зависит от вас, чтобы использовать его в качестве промежуточного программного обеспечения маршрута и размещать его по определенным маршрутам.
Это должно сделать пакет работы с L5.1
Ответ 5
gostaria que alguem que me ajudasse, есть проблемы с тендо, erro de CORS no laravel 5.1. О, Фасо? Ja tentei quase tudo que encontrei na Internet, mais ele nao funciona. [Requisicao AJAX]
Ответ 6
просто используйте это как промежуточное ПО
<?php
namespace App\Http\Middleware;
use Closure;
class CorsMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Methods', '*');
return $response;
}
}
и зарегистрируйте промежуточное ПО в файле ядра по этому пути app/Http/Kernel.php
, в какой группе вы предпочитаете, и все будет хорошо