SvelteKit部署CloudRun后hooks.ts重定向失效问题求助
SvelteKit部署CloudRun后hooks.ts重定向失效排查方案
问题场景
本地运行SvelteKit应用时,hooks.ts代码如下:
import { redirect, type Handle } from '@sveltejs/kit'; export const handle: Handle = async ({ event, resolve }) => { const { pathname } = event.url; console.log('Full URL:', event.url); console.log('Pathname:', pathname); if (pathname.startsWith('/events')) { throw redirect(301, '/'); } if (pathname.startsWith('/nl')) { throw redirect(301, '/'); } if (pathname === '/privacy-policy') { throw redirect(301, '/privacy'); } if (pathname.startsWith('/terms')) { throw redirect(303, '/terms.pdf'); } if (pathname.startsWith('/support')) { throw redirect(303, '/contact'); } console.log('No redirect triggered.'); return await resolve(event); };
使用pnpm dev启动时所有重定向正常,但部署至CloudRun后,访问/support等路径出现404页面未找到,且hooks.ts中的日志完全未触发。
CloudRun日志片段:
textPayload: "SvelteKitError: Not found: /support at resolve2 (file:///app/build/server/index.js:4909:18) at file:///app/build/server/index.js:4731:19 at AsyncLocalStorage.run (node:internal/async_local_storage/async_hooks:91:14) at with_event (file:///app/build/server/index.js:1868:22) at resolve (file:///app/build/server/index.js:4729:11) at init_promise.#options.hooks.handle (file:///app/build/server/index.js:4985:71) at file:///app/build/server/index.js:4724:28 at AsyncLocalStorage.run (node:internal/async_local_storage/async_hooks:91:14) at with_event (file:///app/build/server/index.js:1868:22) at respond (file:///app/build/server/index.js:4722:28) {" timestamp: "2025-03-24T15:31:35.625761Z"
排查思路与解决方案
1. 确认SvelteKit适配器类型
CloudRun是Node.js运行环境,必须使用@sveltejs/adapter-node,禁止使用静态适配器(如adapter-static或adapter-auto自动选择静态模式):
- 修改
svelte.config.js配置:import adapter from '@sveltejs/adapter-node'; export default { kit: { adapter: adapter() } }; - 重新执行
pnpm build,确保部署的是Node.js适配后的完整产物。
2. 验证请求路径一致性
检查CloudRun是否对请求路径做了修改(如添加前缀、自动补全尾部斜杠):
- 临时在
handle钩子最顶部添加日志,输出完整event.url:console.log('Incoming request URL:', event.url.toString()); - 部署后查看CloudRun日志,确认实际传入的
pathname是否与预期一致(比如是否为/prefix/support而非/support)。
3. 统一尾部斜杠配置
如果CloudRun自动添加尾部斜杠,会导致pathname.startsWith('/support')不匹配:
- 在
svelte.config.js中设置统一的尾部斜杠规则:export default { kit: { trailingSlash: 'never' // 或 'always',与CloudRun行为保持一致 } };
4. 检查构建产物完整性
- 本地执行
pnpm build后,检查build/server目录是否包含hooks相关的编译代码; - 部署时确保完整上传
build目录,避免遗漏服务器端文件; - 禁止使用
adapter-static,静态适配器会预渲染页面,不会运行服务器端的handle钩子。
5. 确认CloudRun端口配置
SvelteKit Node适配器默认监听3000端口,需在CloudRun服务设置中把容器端口配置为3000,否则请求无法正确到达应用。
6. 强制调试钩子执行状态
修改handle钩子,强制在匹配路径时返回重定向并输出日志,验证钩子是否被加载:
export const handle: Handle = async ({ event, resolve }) => { console.log('Hook triggered for:', event.url.pathname); if (event.url.pathname.startsWith('/support')) { throw redirect(303, '/contact'); } return await resolve(event); };
如果部署后仍无日志输出,说明钩子未被加载,需重新检查适配器配置和构建流程。
内容的提问来源于stack exchange,提问作者Riël
相关产品推荐
相关产品推荐

