SvelteKit adapter-node构建Nginx非根路径proxy_pass重定向过多问题排查
我来帮你搞定这个「too many redirects」的问题!这个问题核心是Nginx代理配置和SvelteKit的base路径设置重复,导致请求路径被多次追加,触发了无限重定向。下面是具体的修复方案:
问题原因分析
你已经在svelte.config.js里设置了kit.paths.base: '/dashboard_v2',这意味着adapter-node运行的预览服务会自动处理所有以/dashboard_v2开头的请求,内部路由也会基于这个base路径工作。但你在Nginx的location /dashboard_v2/里把请求转发到http://localhost:4173/dashboard_v2,这就造成了路径重复:用户访问mydomain.com/dashboard_v2/xxx时,Nginx会把它转发到http://localhost:4173/dashboard_v2/xxx,而SvelteKit看到这个请求后,会认为实际路径应该是/dashboard_v2/dashboard_v2/xxx(因为base路径是/dashboard_v2),于是触发重定向到它认为的「正确路径」,最终形成循环。
具体修改步骤
1. 调整Nginx代理配置
把location /dashboard_v2/里的proxy_pass修改为不带/dashboard_v2的地址,同时添加重定向头处理规则:
修改后的Nginx配置片段:
location /dashboard_v2/ { proxy_pass http://localhost:4173/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 修正SvelteKit返回的重定向头,确保路径包含正确的base前缀 proxy_redirect http://localhost:4173/ /dashboard_v2/; # WebSocket支持配置保持不变 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
关键修改点:
proxy_pass从http://localhost:4173/dashboard_v2改为http://localhost:4173/(结尾的斜杠保证路径映射准确)- 添加
proxy_redirect指令,把SvelteKit返回的http://localhost:4173/xxx重定向头替换为/dashboard_v2/xxx,避免前端拿到错误的跳转地址 - 将
proxy_set_header Host从$http_host改为$host,避免某些场景下主机名不一致引发的问题
2. 保留SvelteKit原有配置
你的svelte.config.js设置是完全正确的,不需要做任何修改:
import adapter from '@sveltejs/adapter-node'; import preprocess from "svelte-preprocess"; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { adapter: adapter(), csrf: { checkOrigin: false }, paths: {base: '/dashboard_v2'} }, }; export default config;
3. 重启服务生效
- 重启Nginx:
sudo systemctl restart nginx - 确保你的SvelteKit预览服务正常运行(无需重启,因为配置没有改动)
验证
访问mydomain.com/dashboard_v2,应该就能正常加载页面,不会再出现重定向循环的问题了。如果还有异常,可以查看Nginx错误日志(/var/log/nginx/error.log)和SvelteKit服务日志,排查是否有其他路径匹配问题。
内容的提问来源于stack exchange,提问作者Alok

