Nginx配置问题:SvelteKit拦截/api路由无法访问Rust后端
解决Nginx代理/api路径被SvelteKit拦截的问题
你的问题核心在于Nginx的location匹配优先级错误,以及之前的rewrite正则表达式写错,导致/api路径的请求还是落到了SvelteKit服务上。下面是两种场景的正确配置:
场景1:Rust后端直接接收/api开头的路径
如果你的Rust后端期望处理/api/xxx这类路径,用以下配置:
server { listen 80; listen [::]:80; server_name my-domain.com www.my-domain.com; # 用^~确保这个location优先级最高,优先匹配/api/开头的请求 location ^~ /api/ { proxy_pass http://localhost:8000; # 必须添加这些代理头部,否则后端可能无法正确解析请求 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; } # 处理不带斜杠的/api请求,重定向到带斜杠的路径 location = /api { return 301 /api/; } location / { proxy_pass http://localhost:3000; 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; } }
场景2:Rust后端接收去掉/api前缀的路径
如果你的Rust后端期望处理/xxx(对应前端的/api/xxx),需要修正rewrite规则:
server { listen 80; listen [::]:80; server_name my-domain.com www.my-domain.com; location ^~ /api/ { # 正确的正则:捕获/api/之后的所有内容,替换为/$1 rewrite ^/api/(.*)$ /$1 break; proxy_pass http://localhost:8000; 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; } location = /api { return 301 /api/; } location / { proxy_pass http://localhost:3000; 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; } }
关键说明
^~修饰符:让/api/的location优先级高于/的前缀匹配,确保请求不会被SvelteKit接管。- 修正rewrite正则:你之前写的
^/api^/是无效的,正确写法是^/api/(.*)$来捕获路径部分。 - 处理
/api(不带斜杠):添加专门的location重定向到/api/,避免请求落到SvelteKit。 - 代理头部:必须设置
Host等头部,否则后端可能无法正确识别请求来源,导致路由错误。
配置修改后,执行sudo nginx -s reload重启Nginx生效。另外可以先通过curl http://localhost:8000/xxx测试Rust后端是否正常响应,再验证域名访问。
内容的提问来源于stack exchange,提问作者Tom Planche
相关产品推荐
相关产品推荐

