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

Next.js中未认证用户访问API路由如何返回与默认一致的404响应

解决方法

你只需要补全和Next.js默认404响应一致的响应头,同时返回内置404页面的内容即可,修改后的代码如下:

// api/test.js
import { getSession } from 'next-auth/client'
import fs from 'fs/promises'
import path from 'path'

export default async (req, res) => {  
    const session = await getSession({ req });

    if (session) {
        // 已登录场景直接返回会话信息
        return res.status(200).json(session);
    }

    // 未认证场景伪装成404
    res.status(404);
    // 补全和默认404完全一致的响应头
    res.setHeader('Cache-Control', 'no-store, must-revalidate');
    res.setHeader('X-Powered-By', 'Next.js');
    res.setHeader('Content-Type', 'text/html; charset=utf-8');

    // 读取Next.js内置404页面内容返回
    const fourOhFourPath = path.join(process.cwd(), '.next', 'server', 'pages', '404.html');
    try {
        const pageContent = await fs.readFile(fourOhFourPath, 'utf8');
        res.setHeader('Content-Length', Buffer.byteLength(pageContent));
        res.write(pageContent);
    } catch (err) {
        // 开发环境适配:未提前打包404静态文件时直接渲染动态404页
        res.render('404');
    }

    res.end();
}

原逻辑问题说明

你之前的代码仅设置了404状态码就直接结束响应,没有返回任何内容所以显示空白,同时缺失了默认404的标准响应头,因此和访问不存在路由的返回结果存在差异。
上述修改同时兼容开发环境和生产环境,最终返回的响应头、响应体都和Next.js默认404完全一致,外部无法区分是路由不存在还是权限被拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 10:36:03