目录
最近发现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模拟被代理的服务。通过观察此服务接收到的请求