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

Next.js配置重定向时如何禁止特殊字符自动URL编码

Next.js 重定向自动URL编码问题解决方案

问题场景

在next.config.js中配置如下永久重定向规则:

{
    source: '/page.aspx:urlstr*',
    destination: 'https://someurl.com/page.aspx:urlstr*',
    permanent: true,
},

实际触发重定向的URL携带含+的未编码查询字符串,示例:
/page.aspx?woXxJNrRIMKVC109awwTopP+k2NmkvXf+MzijTEc3zIZ3pf4n+Yknq
Next.js内置重定向逻辑会自动对动态匹配的内容做URL编码,将+转义为%20,最终跳转地址为:
https://someurl.com/page.aspx?woXxJNrRIMKVC109awwTopP%20k2NmkvXf%20MzijTEc3zIZ3pf4n%20Yknq
目标旧服务器无法解析编码后的查询参数,需要实现URL原样转发。

可行方案

next.config.js的静态重定向配置没有提供关闭自动URL编码的开关,内置逻辑会强制对所有匹配到的动态片段做标准化编码,无法通过配置项修改该行为,可通过以下两种方式实现需求:

  • 方案1:使用Middleware实现无编码重定向(适配所有Next.js部署模式,包括Vercel、Node服务、边缘部署)
    Middleware运行在请求路由处理前的边缘层,可以直接获取原始请求的查询字符串,手动返回重定向响应,完全绕过内置重定向的编码逻辑。
    1. 在项目根目录(存在src目录则放到src目录下)新建middleware.js文件
    2. 写入以下逻辑:
    import { NextResponse } from 'next/server'
    
    export function middleware(request) {
      // 拦截需要重定向的page.aspx请求
      if (request.nextUrl.pathname === '/page.aspx') {
        // 直接拼接原始查询串,不做任何编码转换
        const redirectTarget = new URL(`https://someurl.com/page.aspx${request.nextUrl.search}`)
        // permanent: true对应308永久重定向状态码,临时重定向替换为307即可
        return NextResponse.redirect(redirectTarget, { status: 308 })
      }
      // 非目标路径放行,走正常路由逻辑
      return NextResponse.next()
    }
    
    // 配置拦截范围,仅处理目标路径减少性能损耗
    export const config = {
      matcher: '/page.aspx',
    }
    
    该方案中request.nextUrl.search会直接返回请求携带的原始查询字符串,不会做任何转义处理,最终返回的重定向响应头里的Location地址会完全保留原始URL的特殊字符格式。
  • 方案2:自定义服务层拦截重定向(仅适用于自定义Node.js服务部署场景)
    如果项目采用自定义Node服务(搭配Express/Koa等框架)部署,可以在服务层直接拦截对应路径的请求,手动设置Location响应头返回308/301状态码,完全绕过Next.js的路由处理逻辑,直接拼接原始URL即可实现原样转发。

注意:不要尝试在静态重定向配置中通过修改匹配规则、添加未编码参数的方式绕过编码,该逻辑为Next.js路由层硬编码实现,静态配置层面没有修改入口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:06:32