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

SvelteKit服务端重定向至其他路由时,如何获取跳转来源?

实现方法

有几种可靠的方式可以区分/b路由的请求来源,以下是具体方案:

方法一:利用Referer请求头

浏览器在重定向时通常会发送Referer请求头,记录跳转前的页面地址。你可以在/b的+page.server.ts的load函数中读取这个头来判断:

// src/routes/b/+page.server.ts
import type { PageServerLoad } from './$types';

export const load: PageServerLoad = async ({ request }) => {
  const referer = request.headers.get('referer');
  const isFromARedirect = referer?.includes('/a');

  return {
    isFromARedirect
  };
};

注意:部分浏览器在隐私模式下会屏蔽Referer头,这种情况下无法通过该方式判断,适合对兼容性要求不高的场景。

方法二:添加自定义查询参数

在/a的重定向逻辑中附加一个查询参数,比如?from=a,然后在/b的load函数中读取该参数,还可以额外做一次重定向去掉参数,避免URL残留:

// src/routes/a/+page.server.ts
import type { PageServerLoad } from './$types';
import { redirect } from '@sveltejs/kit';

export const load: PageServerLoad = async () => {
  // 假设这里是你的重定向条件
  const shouldRedirect = true;
  if (shouldRedirect) {
    throw redirect(301, '/b?from=a');
  }
};
// src/routes/b/+page.server.ts
import type { PageServerLoad } from './$types';
import { redirect } from '@sveltejs/kit';

export const load: PageServerLoad = async ({ url }) => {
  const from = url.searchParams.get('from');
  const isFromARedirect = from === 'a';

  // 如果是来自/a的重定向,去掉参数后重定向一次
  if (isFromARedirect) {
    throw redirect(302, '/b');
  }

  return {
    isFromARedirect: false
  };
};

补充:如果不需要隐藏参数,可以省略第二次重定向,直接在页面中使用isFromARedirect的值。这种方法不受浏览器设置影响,可靠性更高。

方法三:使用Session存储状态

如果不想暴露参数,可以借助SvelteKit的Session功能存储状态,重定向后读取并清除:

首先确保你的项目已经配置了Session(比如使用cookie-based session),然后:

// src/routes/a/+page.server.ts
import type { PageServerLoad } from './$types';
import { redirect } from '@sveltejs/kit';

export const load: PageServerLoad = async ({ locals }) => {
  const shouldRedirect = true;
  if (shouldRedirect) {
    await locals.session.set('from_a', true);
    throw redirect(301, '/b');
  }
};
// src/routes/b/+page.server.ts
import type { PageServerLoad } from './$types';

export const load: PageServerLoad = async ({ locals }) => {
  const isFromARedirect = await locals.session.get('from_a') === true;
  
  // 读取后立即清除,避免后续访问受影响
  if (isFromARedirect) {
    await locals.session.delete('from_a');
  }

  return {
    isFromARedirect
  };
};

优势:状态不会暴露在URL中,适合需要隐藏来源信息的场景,但需要额外配置Session。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:57:11