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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:16:15