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

Next.js添加rewrites配置后动态路由无法访问的解决求助

问题根源

你写的rewrites规则把所有请求(包括动态路由)全转到/app/:path*了,但你的页面组件根本不在app目录里——比如/dashboard/admin/[adminId]/page.tsx对应的路径是/dashboard/admin/:adminId,被rewrite后变成/app/dashboard/admin/:adminId,这个路径下没有对应的组件,自然访问不了。

最优解决方案:用Next.js官方的basePath替代rewrites

Next.js专门提供了basePath配置来处理应用部署在子路径的场景,比自己写rewrites靠谱多了,还能自动处理静态资源、路由前缀这些细节。

把你的next.config.js改成这样:

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    formats: ["image/webp"],
  },
  // 生产环境给所有路由加/app前缀,开发环境用根路径
  basePath: process.env.NODE_ENV === "production" ? "/app" : "",
  publicRuntimeConfig: {
    basePath: process.env.NODE_ENV === "production" ? "/app" : "",
  },
};

module.exports = nextConfig;

这样配置后,生产环境下访问/app/dashboard/admin/1会自动匹配到你根目录下的/dashboard/admin/[adminId]/page.tsx组件,动态路由就能正常工作了,开发环境还是用原来的路径访问,不用改任何代码。

要是非得用rewrites(不推荐)

如果硬要保留rewrites,得调整规则,别把现有路由也转走。比如只转发那些没匹配到你现有页面的请求,但这种方式容易出问题,不如用basePath省心:

async rewrites() {
  return [
    {
      source: "/:path*",
      destination: "/app/:path*",
      // 排除已有的路由前缀,避免dashboard、login等路径被错误转发
      has: [
        {
          type: "pathname",
          value: "^/(?!dashboard|login).*$",
        },
      ],
    },
  ];
}

但这种写法需要维护排除规则,后续加新路由还得更新,远不如basePath方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:29:56