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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:57