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

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;
    }
}

关键说明

  1. ^~修饰符:让/api/的location优先级高于/的前缀匹配,确保请求不会被SvelteKit接管。
  2. 修正rewrite正则:你之前写的^/api^/是无效的,正确写法是^/api/(.*)$来捕获路径部分。
  3. 处理/api(不带斜杠):添加专门的location重定向到/api/,避免请求落到SvelteKit。
  4. 代理头部:必须设置Host等头部,否则后端可能无法正确识别请求来源,导致路由错误。

配置修改后,执行sudo nginx -s reload重启Nginx生效。另外可以先通过curl http://localhost:8000/xxx测试Rust后端是否正常响应,再验证域名访问。

内容的提问来源于stack exchange,提问作者Tom Planche

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:10:11