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

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),无需额外调整。

验证修复效果

  1. 执行npm run build && npm run preview;
  2. 登录后访问/dashboard,确认页面正常加载,无重定向循环;
  3. 未登录时访问/dashboard,会正确重定向到/login;
  4. 已登录时访问/login,会正确重定向到/dashboard。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:18:17