關於前後端分離跨域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 協議》,轉載必須註明作者和本文連結