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

Next.js重写规则生效但JS/CSS资源出现404错误求助

解决同一域名下多Next.js项目重写后的资源加载404问题

问题本质:服务端重写只是转发请求,但子项目(forums.mysite.com)编译生成的HTML中,脚本、样式等资源路径默认是相对自身域名的(比如/_next/static/...)。当页面在主域名mysite.com/topic/下渲染时,浏览器会尝试从mysite.com/_next/static/...加载这些资源,而主项目不存在这些资源,因此返回404。

以下是可行的解决办法:

方案一:给子项目配置assetPrefix和basePath

修改子项目(forums.mysite.com)的next.config.js,指定资源加载的前缀路径和基础路径,确保浏览器直接从子域名加载资源:

/**
 * @type {import('next').NextConfig}
 */
const nextConfig = {
  // 指定资源加载的完整域名前缀
  assetPrefix: 'https://forums.mysite.com',
  // 匹配主项目重写的路径前缀
  basePath: '/topic',
};

module.exports = nextConfig;

配置后,子项目生成的资源路径会变为https://forums.mysite.com/topic/_next/static/...,浏览器会直接从子域名拉取资源,避免与主项目的资源路径冲突。

方案二:在主项目添加资源路径的重写规则

如果不想修改子项目配置,可以在主项目的重写规则中,添加对子项目资源路径的转发,让主域名的资源请求也转发到子域名:

const rewrites = async () => [
  {
    source: "/topic/",
    destination: "https://forums.mysite.com/topic/",
  },
  {
    source: "/topic/:match*",
    destination: "https://forums.mysite.com/topic/:match*",
  },
  // 转发子项目的静态资源请求
  {
    source: "/_next/static/topic/:match*",
    destination: "https://forums.mysite.com/_next/static/topic/:match*",
  },
];

/**
 * @type {import('next').NextConfig}
 */
const nextConfig = {
  rewrites,
};

module.exports = nextConfig;

注意:如果子项目未配置basePath,则资源路径重写规则需要改为source: "/_next/static/:match*"。但这种方式可能会和主项目自身的/_next/static/资源路径冲突,需谨慎使用。

注意事项

  • 子项目配置basePath后,内部路由(如Link组件、useRouter)需要适配该前缀,避免路由跳转错误。
  • 部署子项目时,确保basePath与主项目的重写路径完全匹配,避免路径不一致导致的请求错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:40:24