如何在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,提问作者Арсений Кузнецов
相关产品推荐
相关产品推荐

