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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:54:07