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

SvelteKit表单提交后无法获取redirectTo参数导致重定向失败

SvelteKit 登录后无法获取redirectTo查询参数的解决方案

问题场景

在SvelteKit项目中,部分路由(如/movies)需要认证才能访问,未登录用户会被重定向到/login?redirectTo=%2Fmovies。但登录表单提交后,login/+page.server.ts中无法获取URL上的redirectTo查询参数,控制台输出的URL不含该参数。

路由结构

routes
│     ├── +page.svelte
│     ├── login
│     │   ├── +page.server.ts
│     │   └── +page.svelte
│     └── movies
│         ├── +page.server.ts
│         ├── +page.svelte
│         └── [id]
│             ├── +page.server.ts
│             ├── +page.svelte
│             └── +page.ts

原login/+page.server.ts核心代码

import { redirect } from '@sveltejs/kit';

export const actions = {
    login: async ({request, cookies, url}) => {
        console.log("url", url)
        const formData = await request.formData();
        const data = { email: formData.get('email'), password: formData.get('password')}
        // 认证逻辑...
        const redirectTo = url.searchParams.get('redirectTo') || '/'
        redirect(303, redirectTo);
    }
}

控制台输出的URL信息

url URL {
  href: 'http://localhost:5173/login?/login',
  searchParams: URLSearchParams { '/login' => '' },
  // 其他信息...
}

解决方案

通过在表单的use:enhance钩子中,将redirectTo参数附加到表单数据中,传递到action里解决该问题。

修改后的login/+page.svelte代码

<script lang="ts">
  import { enhance } from "$app/forms";
  import { page } from "$app/stores";
  let currentUrl = $page.url.href;
  const url: URL = new URL(currentUrl);
  const redirectTo: string = url.searchParams.get("redirectTo") ?? "";
</script>

<h1>Login</h1>
<form
  method="POST"
  action="?/login"
  use:enhance={({ formData }) => {
    formData.append("redirectTo", redirectTo);
  }}
>
  <label
    >Email
    <input name="email" type="email" required />
  </label>
  <label
    >password
    <input name="password" type="password" required />
  </label>
  <button>Log in</button>
</form>

修改后的login/+page.server.ts核心代码

import { redirect } from '@sveltejs/kit';

export const actions = {
    login: async ({request, cookies}) => {
        const formData = await request.formData();
        const data = { 
            email: formData.get('email'), 
            password: formData.get('password'), 
            redirectTo: formData.get("redirectTo")
        }
        // 认证逻辑...
        const redirectTo = data.redirectTo != null ? data.redirectTo.toString() : "/"
        redirect(303, redirectTo);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:11