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

如何在Nginx中截断请求URL并代理到后端服务

Nginx代理时截断URL前缀的解决方案

你需要将example.com/blabla/admin/dashboard/...这类请求代理到后端服务的/admin/dashboard/...路径,也就是去掉URL开头的/blabla前缀,但当前配置里使用proxy_pass http://web1$uri会把完整的请求路径(包括前缀)传给后端,所以达不到预期效果。

下面提供两种可行的解决方法:

方法一:利用Nginx proxy_pass的自动路径截断特性

当location采用前缀匹配且末尾带有斜杠,同时proxy_pass的目标URL末尾也带有斜杠时,Nginx会自动去掉location匹配的前缀部分,将剩余路径转发给后端:

upstream web1 {  
    server site1:8080;  
}  

upstream web3 {  
    server site3:8080;  
}  

upstream web2 {  
    server site2:8080;  
}  

server {  
    listen       80;  
    listen  [::]:80;  
    # server_name  localhost;  

    location /balaboba/ {  
        proxy_pass http://web1/;  
    }  

    location /catsruletheworld/ {  
        proxy_pass http://web2/;  
    }  

    location /lolkek/ {  
        proxy_pass http://web3/;  
    }  
}

如果需要匹配不带末尾斜杠的请求(比如/balaboba),可以额外添加一个location块处理根路径:

location = /balaboba {  
    proxy_pass http://web1/;  
}

方法二:用rewrite指令显式修改路径

通过rewrite正则匹配,显式截断URL前缀后再转发给后端,这种方式更灵活,能适配各种路径格式:

upstream web1 {  
    server site1:8080;  
}  

upstream web3 {  
    server site3:8080;  
}  

upstream web2 {  
    server site2:8080;  
}  

server {  
    listen       80;  
    listen  [::]:80;  
    # server_name  localhost;  

    location /balaboba {  
        rewrite ^/balaboba(.*)$ $1 break;  
        proxy_pass http://web1;  
    }  

    location /catsruletheworld {  
        rewrite ^/catsruletheworld(.*)$ $1 break;  
        proxy_pass http://web2;  
    }  

    location /lolkek {  
        rewrite ^/lolkek(.*)$ $1 break;  
        proxy_pass http://web3;  
    }  
}

rewrite ^/balaboba(.*)$ $1 break;的作用是把所有以/balaboba开头的URL,替换成/balaboba之后的部分,break表示停止后续的rewrite规则处理,确保修改后的路径被转发给后端。

内容的提问来源于stack exchange,提问作者Арсений Кузнецов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:05:24