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
相关产品推荐
相关产品推荐

