Nginx proxy_pass避免URI decode

本文详细介绍了在遇到Nginx代理时URI自动解码导致的问题,通过实验展示了如何配置`proxy_pass`以避免解码。实验包括多种location配置,如直接指定URL、使用$1变量以及if条件语句,最终得出结论,配置不含路径的proxy_pass或结合正则表达式使用变量可以防止自动解码。
摘要由CSDN通过智能技术生成

目录

1、场景

2、问题探究

2.1 编写 nginx.conf

2.2 开启第1段location配置

2.3 开启第2段location配置

2.4 开启第3段location配置

2.5 开启第4段location配置

2.6 另外可行的location配置

3、总结

# 配置2

# 配置3

# 配置4

# 配置5

# 配置6

4、参考


最近发现Nginx proxy_pass后端URI进行了decode的问题,网上查了查资料,这里汇总一下

参考:

#786 (url decoding is senseless for proxy_pass) – nginx

Nginx pass_proxy subdirectory without url decoding - Stack Overflow

1、场景

        有个查询项目详情接口 /projects/{name},正好我们要查询名称为 root/name 的项目,此时我们不能直接访问 /projects/root/name,这样会被系统误认为是要查询名称为 root 的项目。所以,在实际开发中需要将 root/name 先进行UrlEncode(编码)再拼接到url上,即 /projects/root%2fname

      最近在访问Nginx代理的服务时,此类url的api调用一直是404的异常,然而不通过nginx代理,直接访问后端服务时,此类url的api调用又是正常的。

2、问题探究

        通过搜罗网上的相关资料,发现是nginx自动进行 UrlDecode(解码)的问题。
下面对各种nginx配置进行实验,探究如何避免自动UrlDecode:

2.1 编写 nginx.conf

         第一个server配置就是我们常规的代理配置,会将请求代理后端的服务上去,比如运行的springboot项目,tomcat、jetty等等服务。
        配置文件中有多段location配置,我们逐一验证。验证某一端配置时,将其他配置时注释掉!

         第二个server配置模拟被代理的服务(即上面说的tomcat、jetty等等)。这个server直接将请求的uri返回。所以可以通过返回信息得知被代理的服务接收到的url是否被decode。

events {
    worker_connections  1024;
}
http {
    server {
        listen       8088;
        server_name  localhost;
        
        location / {
            proxy_pass http://127.0.0.1:8099/;
        }
        
        #location / {
        #    proxy_pass http://127.0.0.1:8099;
        #}
        
        #location / {
        #    proxy_pass http://127.0.0.1:8099$1;
        #}
        
        #location / {
        #    if ($request_uri ~* ^/(.*)$) {
        #        proxy_pass http://127.0.0.1:8099/$1;
        #    }
        #}
     }
}


        # 此server模拟被代理的服务。通过观察此服务接收到的请求

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值