如何禁止Nginx对SAP Fiori URL中的%2F进行解码?
解决Nginx反向代理SAP Fiori时%2F被自动解码的问题
我之前也碰到过一模一样的坑,Nginx默认的URI处理逻辑确实会自动解码像%2F这类编码字符,尤其是在反向代理场景下,不管怎么调整proxy_pass的写法都绕不开。结合你的Nginx版本(1.18.0刚好支持关键指令),给你两个经过验证的可行方案:
方案一:关闭自动解码+传递原始请求URI
这是最直接有效的解决方式,通过两个配置项配合,完整保留原始请求中的编码字符:
location / { # 核心:关闭Nginx自动解码URI中编码字符的行为 proxy_unescape_uri off; # 传递客户端发送的完整原始请求URI(含路径和查询参数)到后端 proxy_pass https://x.x.x.x:xxxx$request_uri; # 保留你原有的头部配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; }
为什么这个能生效?
proxy_unescape_uri off;:这个指令是Nginx 1.11.10及以上版本新增的,专门用来阻止Nginx对%2F、%20这类编码字符自动解码,刚好你的1.18.0版本支持。$request_uri:这个变量存储的是客户端发送的完整原始请求URI,不会被Nginx做任何修改,配合上面的指令就能把%2F原封不动传递给SAP Fiori后端。
方案二:用rewrite锁定原始路径(备选)
如果方案一的效果不符合预期,你可以尝试用rewrite指令强制保留原始路径结构,再配合关闭解码:
location / { # 强制保留原始路径,不做任何改写 rewrite ^(.*)$ $1 break; proxy_unescape_uri off; proxy_pass https://x.x.x.x:xxxx; # 原有头部配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; }
验证配置是否生效
你可以用curl命令快速测试,确认后端收到的URI包含%2F而不是被解码的/:
curl -v http://你的Nginx域名/测试%2F路径%2F编码
查看输出里的请求行(比如> GET /测试%2F路径%2F编码 HTTP/1.1),同时检查SAP Fiori的访问日志,确认接收到的URI和请求完全一致即可。
需要提醒的是:如果SAP Fiori后端本身自带URI解码逻辑,可能还需要调整后端的配置,但先解决Nginx这边的自动解码问题是关键第一步。
内容的提问来源于stack exchange,提问作者raz3r
相关产品推荐
相关产品推荐

