Nuxt3中子域名路由内部重写失效问题:explore.domain.com无法指向/marketing页面
Nuxt3中子域名路由内部重写失效问题:explore.domain.com无法指向/marketing页面
我来帮你捋一捋这个问题——你的思路方向是对的,但中间件里的重写方式没完全适配Nuxt 3和Nitro的内部路由逻辑,所以才会出现重写后还是显示首页的情况。咱们一步步来解决:
问题根源
你直接修改了node.req.url和event.context.path,但Nuxt 3的路由匹配核心依赖的是Nitro上下文里的event.path,而不是你修改的那些变量。另外,Nitro的路由解析逻辑可能在你修改之前就已经读取了原始路径,导致你的重写没被识别到。
解决方案
这里给你两个方案,推荐用第一个,更简洁且符合官方最佳实践:
方案1:用Nitro内置的Route Rules(推荐)
Nuxt 3的底层Nitro框架支持通过配置文件直接设置路由重写,不需要手动写中间件,稳定性更高。在你的nuxt.config.ts里添加以下配置:
export default defineNuxtConfig({ nitro: { routeRules: { // 匹配explore.domain.com下的所有请求,内部重写到/marketing 'explore.domain.com/**': { rewrite: '/marketing' } } } })
这个配置会让Nitro自动处理所有来自explore.domain.com的请求,内部转发到/marketing路由,同时保持浏览器地址栏的URL不变,完全符合你的需求。
方案2:修复现有中间件逻辑
如果你坚持要用自定义中间件,需要调整重写的目标变量,确保Nitro能识别到路径变化。修改你的server/middleware/redirect.global.js:
import { defineEventHandler, getHeader, getRequestHost } from "h3"; export default defineEventHandler(async (event) => { const host = getHeader(event, "x-forwarded-host") || getRequestHost(event); if (host === "explore.domain.com") { console.log("Rewriting to /marketing"); // 关键:更新event.path,这是Nitro路由匹配的核心依据 event.path = "/marketing"; // 同步更新Node.js请求对象的URL event.node.req.url = "/marketing"; event.node.req.originalUrl = "/marketing"; // 同步更新Nitro内部上下文 if (event.context._nitro) { event.context._nitro.path = "/marketing"; } // 添加调试头方便验证 setHeader(event, "X-Rewrite", "marketing"); } });
核心改动是直接修改event.path而不是event.context.path——这是Nitro和Nuxt路由系统真正依赖的路径变量。
额外验证步骤
- 部署修改后的代码到DigitalOcean App Platform
- 访问
explore.domain.com,查看服务器日志:- 确认
event.path已经被改为/marketing - 检查响应头里的
X-Rewrite是否为marketing,验证中间件是否执行
- 确认
- 如果还是有问题,检查DigitalOcean的转发设置,确保
x-forwarded-host头正确传递(从你的日志看这部分是正常的)
这样调整后,explore.domain.com应该就能正确显示/marketing页面,同时地址栏保持不变,其他域名也能正常使用原有的路由结构。
内容来源于stack exchange
相关产品推荐
相关产品推荐

