Laravel移除URL中api前缀后如何区分API调用与GUI页面请求?
解决方案
以下3种方案均可直接落地使用:
方案1:使用Laravel原生expectsJson()方法(优先推荐,无需修改现有路由配置)
Postman等REST客户端发起请求时,默认会携带Accept: application/json请求头,普通GUI页面的请求默认返回HTML,不会携带该JSON格式请求头,你可以直接复用这个特性调整原有代码:
protected function redirectTo($request) { // 期望返回JSON的请求统一判定为API调用 if ($request->expectsJson()) { // 此处返回自定义错误即可,示例如下 return response()->json([ 'code' => 401, 'message' => '身份验证失败,请登录后重试' ], 401); } return route('login'); }
如果部分自定义客户端不会自动携带Accept头,手动在请求头中添加Accept: application/json即可正常触发判断
方案2:给API路由加专属分组标记(适合需要精准区分的场景)
即使移除了api前缀,你依然可以在路由文件中给所有API路由单独划分分组,添加专属标记:
- 首先在路由文件中定义API路由分组,所有无前缀的API路由都放到该分组下:
// routes/web.php Route::middleware('api.request')->group(function () { // 此处放置你所有的API路由 Route::get('/someAPI', [YourController::class, 'method']); });
- 你可以直接将自定义错误逻辑写到
api.request中间件中,也可以在Authenticate中间件内判断当前路由是否归属该分组,再做对应处理。
方案3:自定义请求头校验
如果客户端完全可控,你可以要求所有API请求必须携带自定义请求头,比如X-API-Request: 1,之后在中间件内做判断即可:
if ($request->header('X-API-Request') == 1) { // 返回自定义错误 }
内容的提问来源于stack exchange,提问作者procodeall
相关产品推荐
相关产品推荐

