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

NextJS API路由出现ERR_TOO_MANY_REDIRECTS无限重定向问题求助

Next.js API路由随机触发无限重定向(ERR_TOO_MANY_REDIRECTS)问题排查与解决思路

问题现象

  • API路由调用偶尔触发无限重定向,最终抛出ERR_TOO_MANY_REDIRECTS错误
  • 临时修复方式:手动在浏览器打开API URL,短暂报错后加载成功,后续前端XHR请求恢复正常,但数天后随机复现,且每个API URL需单独手动"修复"
  • 出现频率:本地每日1次,Vercel生产环境每周1次,跨Next.js版本(v12.1.4 /pages、v14.1.0 /app)存在

已排查情况

  • 重定向发生时,请求未到达API路由(GET方法中添加的console.log无输出)
  • 已尝试next.config.js中设置trailingSlash: true,无效
  • 排除持续触发的中间件场景(多数同类问题的常见原因)
  • API路由代码无重定向逻辑(代码见下文)

相关代码与配置

API路由代码(/pages/api/xxx.js)

import { query, table } from "../backend/db"; // knex function

export default async function handler(req, res) {
  if (req.method === "GET") {
    const contentPages = await getContentPages();

    return res.status(200).json({ result: true, contentPages });
  }
}

async function getContentPages() {
  try {
    const contentPages = await query(table("pages").select());

    return contentPages;
  } catch (e) {
    return { error: true };
  }
}

next.config.js配置

module.exports = {
  experimental: {
    scrollRestoration: true,
  },

  reactStrictMode: false,
  eslint: {
    ignoreDuringBuilds: true,
  },
  output: "export",
  trailingSlash: true,
  exportPathMap: async function (
    defaultPathMap,
    { dev, dir, outDir, distDir, buildId }
  ) {
    return {
      "/k2/": {
        page: "/k2",
      },
    };
  },
};

解决思路与尝试方案

1. 禁用API路由的缓存

由于请求需要实时数据,且重定向可能与缓存规则冲突,可通过响应头强制禁用缓存:
在API路由的响应中添加缓存控制头:

export default async function handler(req, res) {
  if (req.method === "GET") {
    // 添加缓存禁用头
    res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    res.setHeader('Surrogate-Control', 'no-store');

    const contentPages = await getContentPages();
    return res.status(200).json({ result: true, contentPages });
  }
}

2. 检查Vercel部署的边缘缓存规则

如果是Vercel生产环境,可能是边缘网络的缓存策略导致的异常重定向:

  • 登录Vercel控制台,进入项目的Settings > Edge Network
  • 检查是否有针对API路由的自定义缓存规则,尝试删除或调整为Cache-Control: no-store
  • 查看Vercel的函数日志,确认重定向是否发生在边缘层而非函数执行阶段

3. 排查Next.js静态导出的路由冲突

由于配置了output: "export"(静态导出模式),需确认API路由是否在静态导出时被错误处理:

  • 静态导出模式下,API路由不会被打包为服务器函数,而是可能被当作静态资源处理,导致路由匹配异常。如果使用Vercel部署,建议移除output: "export",改用Vercel的默认Serverless函数模式,避免静态导出与API路由的冲突
  • 检查exportPathMap配置是否影响API路由的匹配,尝试暂时移除自定义的exportPathMap测试

4. 启用Next.js日志排查重定向来源

在next.config.js中启用更详细的日志,追踪重定向的触发点:

module.exports = {
  // ...其他配置
  logging: {
    fetches: {
      fullUrl: true,
    },
  },
}

同时在本地开发时使用next dev --debug启动,查看控制台是否有重定向相关的日志输出

5. 检查DNS与CDN配置(生产环境)

如果生产环境使用了自定义域名或CDN,可能是DNS缓存或CDN规则导致的路由解析异常:

  • 检查CDN是否有针对API路径的重定向规则,确保没有循环重定向配置
  • 尝试刷新DNS缓存,或临时切换到Vercel默认域名测试是否仍出现问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:12:48