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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:07:04