laravel cross domain - laravel跨域解决方案以及如何实现跨域请求

我们在用 laravel 进行开发的时候,特别是前后端完全分离的时候,由于前端项目运行在自己机器的指定端口 (也可能是其他人的机器) , 例如 localhost:8000 , 而 laravel 程序又运行在另一个端口,这样就跨域了,而由于浏览器的同源策略,跨域请求是非法的。其实这个问题很好解决,只需要添加一个中间件就可以了。

中间件代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

namespace App\Http\Middleware;

use Closure;

class EnableCrossRequestMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);

$httpWay = config('app.env') == 'local' ? 'http://' : 'https://';
$domain = config('routes.H5_HOST', 'm.xxx.com');

$response->header('Access-Control-Allow-Origin', $httpWay . $domain);

$response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
$response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
$response->header('Access-Control-Allow-Credentials', 'true');

return $response;
}
}

然后在App\Http\Kernel.php中添加对应的配置就可以了

我的是在

1
2
3
4
protected $routeMiddleware = [
// ...
'cross.domain' => \App\Http\Middleware\EnableCrossRequestMiddleware::class,
]

这个地方加入的中间件配置

使用的话在路由中直接调用就可以了

1
2
3
4
5
6
7
8
9
10
11
12
// api
Route::group(['domain' => config('routes.API_HOST', 'api.xx.com')], function () {
Route::group([
'middleware' => [
'cross.domain',
],
'prefix' => '/api',
'namespace' => 'XXX',
], function () {
Route::post('/xxx/xx', 'xxxController@index');
});
});

这样就实现了给指定的接口添加跨域处理的逻辑了

只是补充

1,如何创建中间件

1
php artisan make:middleware EnableCrossRequestMiddleware