SvelteKit钩子认证逻辑构建后出现无限重定向问题
解决SvelteKit生产环境下认证重定向循环问题
问题根源分析
开发环境正常,但构建后预览或部署到生产环境时,携带Session Cookie访问/dashboard会陷入重定向循环,核心原因是客户端与服务器端重定向逻辑重复+生产环境Cookie配置不兼容:
- 客户端页面(
dashboard/+page.svelte和login/+page.svelte)中存在基于$session的重定向逻辑,与服务器端handle钩子的重定向规则冲突; - 生产环境下Cookie的
secure属性设为true,但本地预览(npm run preview)使用HTTP协议,浏览器不会发送该Cookie到服务器,导致服务器端误判用户未登录,触发重定向。
修复步骤
1. 移除客户端冗余重定向逻辑
删除dashboard/+page.svelte中的客户端重定向代码:
<!-- 移除这段代码 --> $: if (!$session.logged_id) { window.location.href = '/login?next=' + $page.url.pathname; }
删除login/+page.svelte中的客户端重定向代码:
<!-- 移除这段代码 --> $: if ($session.logged_id) { window.location.href = '/dashboard'; }
仅保留服务器端handle钩子的重定向规则,确保认证逻辑统一在服务器端处理,避免前后端判断不一致。
2. 调整Cookie的secure属性配置
修改login/+page.server.ts中的Cookie设置逻辑,适配本地预览的HTTP环境:
cookies.set('access_token', 'test_token', { path: '/', httpOnly: true, // 仅在实际HTTPS生产环境下启用secure secure: process.env.NODE_ENV === 'production' && process.env.SITE_URL?.includes('https://'), sameSite: 'strict', maxAge: 60 * 60 * 24 });
如果需要在本地预览时测试生产环境逻辑,可以手动设置环境变量SITE_URL=https://localhost:4173,或者临时将secure设为false进行测试。
3. 验证钩子逻辑的正确性
确保handle钩子中的路径判断和Cookie解析逻辑无遗漏:
- 确认
parse(event.request.headers.get('cookie') || "")能正确解析Cookie; - 路径判断使用
startsWith('/dashboard')可覆盖所有子路径(如/dashboard/profile),无需额外调整。
验证修复效果
- 执行
npm run build && npm run preview; - 登录后访问
/dashboard,确认页面正常加载,无重定向循环; - 未登录时访问
/dashboard,会正确重定向到/login; - 已登录时访问
/login,会正确重定向到/dashboard。
内容的提问来源于stack exchange,提问作者JSaretin
相关产品推荐
相关产品推荐

