关于 Laravel 设置跨域的中间件整理
关于前后端分离跨域2步解决
第一步:
新建中间件php artisan make: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)
{
$response = $next($request);
//当前请求客户端
$origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : '';
//允许跨域客户端
$allow_origin = [
'http://localhost:8081',
'http://localhost:8082',
'http://localhost:8083',
'http://localhost:8084',
];
//可在.env配置参数来控制是否需要验证跨域
if(!in_array($origin,$allow_origin))
return $response;
//通过跨域设置请求头
$headers = [
'Access-Control-Allow-Origin' => $origin,
'Access-Control-Allow-Headers' => 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN',
'Access-Control-Expose-Headers' => 'Authorization, authenticated',
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, OPTIONS',
'Access-Control-Allow-Credentials' => 'true',
];
$IlluminateResponse = 'Illuminate\Http\Response';
$SymfonyResopnse = 'Symfony\Component\HttpFoundation\Response';
// 因为 response 可能是两个不同的类 设置header 方式不一样
if ($response instanceof $IlluminateResponse) {
foreach ($headers as $key => $value) {
$response->header($key, $value);
}
return $response;
}
if ($response instanceof $SymfonyResopnse) {
foreach ($headers as $key => $value) {
$response->headers->set($key, $value);
}
return $response;
}
}
}
第二步
Http
下Kernel.php
添加$middleware
数组下增加\App\Http\Middleware\Cors::class
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\Cors::class,//添加的全局中间件
];
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐
barryvdh/laravel-cors
扩展vue-element-admin框架跨域问题 laravel-cors扩展解决不了,但是作者的这个解决了我的问题,感谢啊