如何阻止Nginx Proxy Pass将%7C转换为竖线|?
问题描述
我有一个URL示例为https://example.com/app/something%7Csomething,当通过Nginx的proxy_pass将其转发为https://example.com/api/something%7Csomething时,%7C被转换为|并引发错误。当前使用的Nginx配置如下:
location /api/ { proxy_pass https://example2.com/; }
请问该如何阻止这种转换?
解决方案
要阻止Nginx对URL编码字符的自动解码转发,可采用以下两种配置方式:
方法一:保留原始请求URI转发
调整proxy_pass的写法,去掉末尾斜杠,直接传递原始请求URI:
location /api/ { proxy_pass https://example2.com; 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; }
这种配置下,Nginx会直接将包含编码%7C的完整原始请求URI转发至后端,不会触发解码操作。
方法二:通过rewrite规则保留编码
利用rewrite提取原始编码路径并终止后续处理:
location /api/ { rewrite ^/api/(.*)$ /$1 break; proxy_pass https://example2.com; }
rewrite指令会原样提取/api/后的编码路径部分,break关键字会阻止Nginx对URI进行进一步解码处理,确保编码字符完整传递。
核心原理
Nginx默认会自动解码请求URI中的编码字符,再构造转发URI。上述两种方法的本质是绕过Nginx的自动解码逻辑,直接传递原始编码的URI字符串到后端服务。
内容的提问来源于stack exchange,提问作者john mich
相关产品推荐
相关产品推荐

