如何限制Laravel API直接访问,仅允许通过Kong API网关调用
实现Laravel API仅允许通过Kong网关访问
要确保Laravel API只能通过Kong网关访问,直接访问原地址返回404,可以通过验证专属请求头的方式实现,以下是具体步骤:
1. 给Kong配置自定义请求头
在Kong的Service或Route配置中,添加一个自定义请求头(比如X-Kong-Access-Token),并设置一个仅你知晓的密钥值。所有经过Kong转发的请求都会自动带上这个头,用于后续合法性验证。
- 可通过Kong Admin API配置,或在Kong Dashboard中给目标Route添加
request-transformer插件,设置添加请求头的规则。
2. 创建Laravel验证中间件
生成专门验证Kong请求的中间件:
php artisan make:middleware VerifyKongProxy
编辑生成的app/Http/Middleware/VerifyKongProxy.php文件,在handle方法中验证请求头:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class VerifyKongProxy { public function handle(Request $request, Closure $next): Response { $validToken = env('KONG_ACCESS_TOKEN'); $requestToken = $request->header('X-Kong-Access-Token'); // 无合法头则返回404 if (empty($requestToken) || $requestToken !== $validToken) { abort(404, 'Not Found'); } return $next($request); } }
3. 添加环境变量配置
在.env文件中添加Kong密钥的配置项:
KONG_ACCESS_TOKEN=your-unique-secret-key
替换your-unique-secret-key为你在Kong中设置的密钥值。
4. 注册并应用中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中注册中间件:
protected $routeMiddleware = [ // ... 其他已有的中间件 'kong.proxy' => \App\Http\Middleware\VerifyKongProxy::class, ];
在routes/api.php中,将需要保护的API路由组绑定这个中间件:
Route::prefix('v1')->middleware('kong.proxy')->group(function () { Route::get('/categories', [CategoryController::class, 'index']); // 其他需要限制访问的API路由 });
5. 可选:服务器层拦截(Nginx)
如果Laravel部署在Nginx上,可直接在Nginx配置中拦截未携带合法Kong头的请求,无需经过Laravel程序,性能更优:
location /api { if ($http_x_kong_access_token != "your-unique-secret-key") { return 404; } # 保留原有的Laravel Nginx配置 try_files $uri $uri/ /index.php?$query_string; }
内容的提问来源于stack exchange,提问作者sushant
相关产品推荐
相关产品推荐

