Next.js中间件URL重写开发正常生产环境失效问题求助
解决Next.js中间件生产环境子域名重写失效问题
可能的原因及修复方案
1. 优先获取反向代理传递的主机头
生产环境中,Vercel、Cloudflare这类反向代理服务通常会通过x-forwarded-host头传递原始请求的主机名,而非直接使用host头。修改Host的获取逻辑:
const host = request.headers.get('x-forwarded-host') || request.headers.get('host') || '';
2. 使用request.nextUrl构造重写URL
原生URL构造在部分部署环境中可能存在解析偏差,改用Next.js内置的request.nextUrl对象修改路径,适配性更强:
if (host.startsWith('dividas') && request.nextUrl.pathname === '/') { const url = request.nextUrl.clone(); url.pathname = '/dividas'; return NextResponse.rewrite(url); }
3. 简化中间件匹配器配置
你的匹配器中/:path*已包含根路径/,可简化配置避免冗余,确保中间件能触发根路径请求:
export const config = { matcher: ['/auth/:path*', '/admin/:path*', '/:path*'] };
4. 验证部署平台子域名路由配置
确认部署平台已将子域名dividas.dominio.com.br绑定到同一Next.js项目,且无额外路由规则拦截根路径请求。虽然你提到直接访问/dividas正常,但仍需确认平台允许子域名根路径被中间件处理。
5. 调试生产环境中间件执行
添加日志(注意不要泄露敏感信息),确认中间件是否触发、Host和路径是否正确:
export function middleware(request) { const host = request.headers.get('x-forwarded-host') || request.headers.get('host') || ''; console.log('当前Host:', host); console.log('当前路径:', request.nextUrl.pathname); // 其余逻辑... }
在部署平台的日志面板查看输出,确认条件判断是否被命中。
修复后的完整代码示例
import { NextResponse } from 'next/server'; export function middleware(request) { const token = request.cookies.get('access_token') || ''; const host = request.headers.get('x-forwarded-host') || request.headers.get('host') || ''; if (host.startsWith('dividas') && request.nextUrl.pathname === '/') { const url = request.nextUrl.clone(); url.pathname = '/dividas'; return NextResponse.rewrite(url); } if (request.nextUrl.pathname.startsWith('/auth')) { if (token) { return NextResponse.redirect(new URL('/admin/posts', request.url)); } } if (request.nextUrl.pathname.startsWith('/admin')) { if (!token) { const loginUrl = new URL('/auth/login', request.url); return NextResponse.redirect(loginUrl); } } return NextResponse.next(); } export const config = { matcher: ['/auth/:path*', '/admin/:path*', '/:path*'] };
内容的提问来源于stack exchange,提问作者Fernando Leão
相关产品推荐
相关产品推荐

