SvelteKit adapter-node部署子目录后url.pathname出现双斜杠问题
问题根源与解决方案
核心问题根源
- SvelteKit配置位置错误:你把
paths配置写在了kit对象外面,SvelteKit根本不会读取这个位置的配置,导致base: '/courses'完全没生效,这是路径解析异常的核心原因。 - Apache反向代理未配置:Apache没有把
/courses路径的请求转发到Node服务的3000端口,请求没正确到达Node应用,才会出现双斜杠、params为空的情况,最终触发500错误。 - 服务启动环境变量缺失:直接执行
node build可能没传递必要的环境变量,影响服务对路径的正确解析。
修复步骤
1. 修正SvelteKit配置
把paths移到kit对象内部,修改svelte.config.js:
import adapter from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/kit/vite'; /** @type {import('@sveltejs/kit').Config} */ const config = { preprocess: vitePreprocess(), kit: { adapter: adapter(), alias: { '$routes': './src/routes', '$routes/*': './src/routes/*', }, // 将paths移到kit内部,这才是正确的配置位置 paths: { base: '/courses', relative: false, }, }, }; export default config;
修改后重新执行npm run build,把新生成的build文件夹上传到服务器覆盖原文件。
2. 配置Apache反向代理
在Apache的站点配置文件中添加反向代理规则,让/courses路径的请求转发到Node服务的3000端口:
<Location /courses> ProxyPass http://localhost:3000 ProxyPassReverse http://localhost:3000 # 处理Cookie路径问题(如果应用用到Cookie) ProxyPassReverseCookiePath / /courses </Location>
配置完成后重启Apache服务,确保规则生效。
3. 正确启动Node服务
启动服务时指定必要的环境变量,命令如下:
PORT=3000 NODE_ENV=production node build
如果用SPanel的NodeJS Manager管理服务,可以直接在面板中添加BASE_PATH=/courses和PORT=3000的环境变量,再重启应用。
4. 验证修复效果
访问https://www.valuespreadsheet.com/courses/bootcamp,查看+layout.server.ts的日志,确认url.pathname应为/courses/bootcamp,params能正确获取动态路由的参数。
内容的提问来源于stack exchange,提问作者kregus
相关产品推荐
相关产品推荐

