如何使用nginx读取和操作POST请求变量?

Gav*_*ard 5 nginx

我正在使用nginx(v1.4.1)代理外部服务,但希望能够POST在代理之前检查并可能修改请求的主体.问题是,我无法POST通过$request_body变量或其他方式在处理请求时访问请求体.

我已经阅读了很多帖子和SO问题,并且已经实现了这个建议的策略,该策略旨在允许记录POST正文(当使用proxy_pass指令时).然而,虽然这对我有用,但我仍然无法$request_body在处理请求期间阅读任何内容.

为清楚起见,这是我配置的相关部分:

location /proxy-this/ {
    client_max_body_size 8k;
    client_body_buffer_size 16k;
    client_body_in_single_buffer on;
    proxy_pass https://example.com/external-endpoint/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_set_header Content-Length '';
}
Run Code Online (Sandbox Code Playgroud)

而我希望能够做到的:

location /proxy-this/ {
    ... (same configuration as above) ...
    set $request_body $request_body&extra_param=1;
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能是使用nginx_lua模块,并看了看HttpFormInputModule,但第一个似乎矫枉过正,后者一段时间没有更新.

foi*_*ibs 5

您是否尝试过使用proxy_set_body

那就像

location /proxy-this/ {
  ... (same configuration as above) ...
  proxy_set_body $request_body&extra_param=1;
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ack -3

尝试修改 POST 数据听起来并不明智。我建议在 proxy_pass 时在查询字符串中设置额外的参数,然后将其作为 GET 变量读取。

proxy_pass https://example.com/external-endpoint/?extra_param=1;
Run Code Online (Sandbox Code Playgroud)

  • 我在谷歌中遇到了这个,这是没有用的,尝试通过代理添加 API 秘密/客户端,即编辑帖子正文是一个非常有效且非常明智的要求。 (2认同)