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运行在请求路由处理前的边缘层,可以直接获取原始请求的查询字符串,手动返回重定向响应,完全绕过内置重定向的编码逻辑。- 在项目根目录(存在
src目录则放到src目录下)新建middleware.js文件 - 写入以下逻辑:
该方案中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
相关产品推荐
相关产品推荐

