You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路由单独划分分组,添加专属标记:

  1. 首先在路由文件中定义API路由分组,所有无前缀的API路由都放到该分组下:
// routes/web.php
Route::middleware('api.request')->group(function () {
    // 此处放置你所有的API路由
    Route::get('/someAPI', [YourController::class, 'method']);
});
  1. 你可以直接将自定义错误逻辑写到api.request中间件中,也可以在Authenticate中间件内判断当前路由是否归属该分组,再做对应处理。

方案3:自定义请求头校验

如果客户端完全可控,你可以要求所有API请求必须携带自定义请求头,比如X-API-Request: 1,之后在中间件内做判断即可:

if ($request->header('X-API-Request') == 1) {
    // 返回自定义错误
}

内容的提问来源于stack exchange,提问作者procodeall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:06:03