单Nginx配置部署两个NextJs应用:静态资源路径异常问题求助
问题根源
你的project2静态资源路径错误,是因为Next.js不知道自己部署在/blog子路径下,构建时生成的静态资源URL默认使用根路径/_next/...,而非期望的/blog/_next/...。你之前尝试的rewrites配置用于路由内部重写,无法解决静态资源路径前缀问题。
方案一:仅修正静态资源路径(推荐,适配原有Nginx配置)
修改project2的
next.config.js
替换原有内容为:module.exports = { assetPrefix: '/blog', };assetPrefix会告诉Next.js在构建时为所有静态资源URL添加/blog前缀,前端加载资源时会自动请求/blog/_next/static/...。重新构建project2
执行构建命令更新静态资源:npm run build保持原有Nginx配置不变
现有Nginx配置中location /blog/_next/static/已正确指向project2的静态文件目录,无需修改。
方案二:统一路由与静态资源路径(彻底适配子路径部署)
如果希望project2的所有路由都基于/blog子路径处理,可使用basePath:
修改project2的
next.config.jsmodule.exports = { basePath: '/blog', };basePath会同时修改路由和静态资源的URL前缀,Next.js会自动处理/blog开头的请求,并生成带前缀的静态资源路径。重新构建project2
npm run build调整Nginx配置
移除location /blog/中的rewrite规则,确保请求原封不动代理到project2服务:location /blog/ { proxy_pass http://localhost:3003; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_hide_header Cache-Control; add_header Cache-Control "no-cache, no-store"; }这样Nginx会将
/blog/xxx的请求直接转发到http://localhost:3003/blog/xxx,Next.js收到后会自动去掉basePath处理内部路由。
内容的提问来源于stack exchange,提问作者Jagveer Singh

