Nuxt3生产环境登录后出现ERR_TOO_MANY_REDIRECTS问题求助
Nuxt3生产环境登录后出现ERR_TOO_MANY_REDIRECTS问题排查与解决
问题情况
开发模式执行pnpm nuxt dev时权限验证中间件运行无异常,但构建后通过pnpm nuxt start启动生产服务,登录后触发ERR_TOO_MANY_REDIRECTS错误。
相关配置代码
权限验证中间件
export default defineNuxtRouteMiddleware(async (to, form) => { if(process.server){ const here = to.name as string const auths = ['login', 'signup', 'password-reset'] const isAuth = Boolean(useCookie('tok').value) if(isAuth && auths.includes(here)){ return navigateTo('/', {external: true, replace: true}) }else if(!isAuth && !auths.includes(here)){ return navigateTo('/login', {external: true, replace: true}) } } })
Apache2代理配置
<VirtualHost localhost:80> ServerName localhost RequestHeader set Host %{HTTP_HOST}s RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME} RequestHeader set X-Real-IP %{REMOTE_ADDR}s RequestHeader add X-Forwarded-For %{REMOTE_ADDR}s Header add Access-Control-Allow-Origin "*" ProxyPreserveHost On ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ </VirtualHost>
Nuxt3 .env配置
NITRO_HOST=localhost NITRO_PORT=3000
使用Nuxt版本:3.6.5
问题原因分析
external: true引发跳转循环:内部路由跳转使用external: true会强制生成完整外部URL,结合Apache代理的ProxyPreserveHost On设置,导致重定向请求在代理与Nuxt服务间反复循环。- 仅服务端执行中间件:
process.server限制中间件仅在服务端运行,客户端路由跳转时无法触发权限验证,两端状态不一致引发重复重定向。 - 路由名称判断不稳定:依赖
to.name判断路由,生产环境路由名称可能因打包压缩或配置变化与开发环境不符,导致权限逻辑判断错误。
解决方案
修改权限中间件
移除process.server判断和external: true选项,改用to.path做稳定的路由判断:
export default defineNuxtRouteMiddleware(async (to) => { const authPaths = ['/login', '/signup', '/password-reset'] const isAuth = Boolean(useCookie('tok').value) if (isAuth && authPaths.includes(to.path)) { return navigateTo('/', { replace: true }) } else if (!isAuth && !authPaths.includes(to.path)) { return navigateTo('/login', { replace: true }) } })
额外检查项
- 确保
tokcookie在生产环境的httpOnly、secure、sameSite属性设置正确,避免客户端或服务端无法读取cookie导致isAuth判断失效。 - 同域代理场景下,可移除Apache配置中冗余的
Access-Control-Allow-Origin "*",避免潜在跨域问题。
内容的提问来源于stack exchange,提问作者mrrobot
相关产品推荐
相关产品推荐

