proxy_pass_request_body 只能设为 on 或 off,不支持变量或条件判断;设为 off 时需配合 proxy_set_body 手动设置请求体,并调整 clientbody* 参数确保正确读取。

proxy_pass_request_body 是一个简单但关键的 Nginx 指令,它控制是否将客户端原始请求体(request body)透传给上游服务器。它的配置方式直接、静态,不支持运行时判断或条件切换,必须明确设为 on 或 off。
它只能是 on 或 off,不能用变量
该指令在 Nginx 配置解析阶段就固化行为,不接受变量、if、map 或任何动态表达式。
写成这样会报错:
proxy_pass_request_body $should_pass; # ❌ 错误:Nginx 不允许此处引用变量
所以,它的取值只有两种:
-
proxy_pass_request_body on;(默认值)→ 原样转发客户端 body -
proxy_pass_request_body off;→ 完全禁用 body 透传,后续必须手动提供内容
关键配合项:proxy_set_body
当设为 off 时,Nginx 不再自动携带原始 body,但上游服务仍可能期待 body(比如 POST/PUT 接口)。若不显式设置,容易触发 400 或 411 错误。
必须搭配 proxy_set_body 显式指定内容,例如:
-
清空 body(发送空字符串):
proxy_pass_request_body off; proxy_set_body "";
-
注入固定 JSON:
proxy_pass_request_body off; proxy_set_body '{ "via": "nginx", "ts": $msec }';
注意:$msec 等内置变量可在 proxy_set_body 中使用,但复杂结构(如嵌套 JSON)需确保引号转义正确,且不能执行逻辑运算。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
必须同步调整的底层参数
即使不转发 body,Nginx 仍需完整读取请求才能解析 header 和 URI。否则可能因 body 未读完就断连,导致异常。
建议启用以下配置:
client_body_in_single_buffer on;
强制把整个 body 缓存在内存中,便于后续 Lua 或变量引用client_body_in_file_only off;
避免 body 被写入临时文件,影响性能和一致性client_max_body_size设为合理值
防止超大 body 触发 413 错误,尤其在off场景下也要预留缓冲空间
动态控制 body 的真实可行路径
如果需要“按条件决定是否透传 body”,proxy_pass_request_body 本身做不到,得借助外部机制:
轻量级方案(基于 header/URI):用
map预定义规则,生成$injected_body变量,再配合proxy_set_body $injected_body和proxy_pass_request_body off灵活方案(基于 body 内容或复杂逻辑):用 OpenResty 的 Lua 模块,在
access_by_lua_block中调用ngx.req.read_body()+ngx.req.get_body_data()判断并重置 body,最后仍需保持proxy_pass_request_body on
无论哪种方式,都绕不开对 client_body_* 缓冲行为的统一管控。
不复杂但容易忽略










