nginx 获取 post body值

原创 2016年08月30日 10:35:58

1.现象

   在nginx中想利用$request_body命令获取post请求的body参数,并落日志,但是发现该变量值为空,查看官网中对$request_body的描述如下:

$request_body
    request body

    The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives when the request body was read to a memory buffer.

意思是只有location中用到proxy_pass,fastcgi_pass,scgi_pass命令时,该变量才有值。


2.使用proxy_pass,fastcgi_pass, scgi_pass等命令获取$request_body值

试了下用proxy_pass,的确可以。配置如下:

worker_processes  1;        #nginx worker 数量
error_log logs/error.log;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  ' "$request_body" ';

    upstream bk_servers_2 {
        server 127.0.0.1:6699;
    }

    server {
        listen 6699;
        location /post/ {
            proxy_pass http://bk_servers_2/api/log/letv/env;
            access_log /home/shuhao/openresty-test/logs/post.log dm;
        }
        location /api/log/letv/env {
            return 202;
        }
    }
}
使用curl命令模拟post请求

curl -i  -d "arg1=1&arg2=2" "http://127.0.0.1:6699/post/"

日志用打印出结果:

 "arg1=1&arg2=2" 

3.使用lua获取$request_body值

条件:使用openresty或者nginx编译了lua模块。

方法:

    server中使用lua_need_request_body on; 或者在location lua代码块中使用 ngx.req.read_body()

注意:

    1)lua代码块中必须有执行语句,否则lua不执行,无法获取request_body;

    2)不要使用return 200;等命令,有return命令,lua代码不执行。

worker_processes  1;        #nginx worker 数量
error_log ~/openresty-test/logs/error.log debug;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  '"$request_body"';
    lua_need_request_body on;
    server {
        listen 6699;
        location /post/ {
            content_by_lua '
                ngx.say("-------")
                ngx.req.read_body()
            ';
            access_log ~/openresty-test/logs/post.log dm;
            #return 200;
        }
    }
}

4. 自定义变量存放request body

方法:

    1)在server 块中使用set $resp_body ""; 声明变量;

    2)在location使用  ngx.var.resp_body = ngx.req.get_body_data() or "-"    为变量赋值

worker_processes  1;        #nginx worker 数量
error_log /home/shuhao/openresty-test/logs/error.log debug;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  ' "$request_body"  --  "$resp_body"';
    lua_need_request_body on;
    server {
        listen 6699;
        set $resp_body "";
        location /post/ {
            lua_need_request_body on;
            content_by_lua '
                local resp_body = ngx.req.get_body_data() or "-"                                                                                                    
                ngx.var.resp_body = resp_body
            ';
            access_log /home/shuhao/openresty-test/logs/post.log dm;
            #return 200;
        }
    }
}










nginx-lua get post请求小例子

/usr/local/nginx/conf/nginx.conf 修改配置文件, 加上自己的url 这里采用了include 方法 nginx_test.conf location /test/p...

使用nginx获取get/post参数值并返回给客户端

使用nginx获取get/post参数值并返回给客户端

nginx 获取post的值

当 nginx 已经读取了请求体数据,并且请求体数据并没有足够大到缓冲到临时文件的时候,请求体数据会在 $request_body 或者  $echo_request_body(这个变量来自 ngx...
  • gzh0222
  • gzh0222
  • 2012年09月10日 13:46
  • 12405

【nginx】App打点场景下,用nginx的log捕获http协议的$request_body的正确方法

【应用场景】 App里面的打点数据想自己收集,可以考虑向nginx发一个json,通过nginx生成的日志实现实时获取数据。 所以问题就归结为nginx日志的生成。 正如  http:/...

Nginx正确记录post日志的方法

Nginx正确记录post日志的方法 事实上可以很简单,这取决于把 access_log 放在哪个 location 里面。 一,放到包含fastcgi_pass或proxy_pass的L...
  • jom_ch
  • jom_ch
  • 2013年11月11日 19:04
  • 25252

nginx处理firefox的POST请求可能遇到的问题:小文件可以提交,大文件不能提交

这个问题是其他同事反映过来的,应该说比较罕见,需要同时满足三种条件才能发生。为了保持神秘,原因暂时不提,不过背景得交待一下。该案例的大概架构就是部署两个nginx服务器,nginx1作为普通的web ...
  • yui
  • yui
  • 2011年05月31日 21:04
  • 15807

让nginx日志支持记录POST请求

转载:http://www.54chen.com/web-ral/nginx-access-log-post.html 移动互联网行业开发过程中,服务端经常会需要检查是否收到请求,收到什么样...

nginx 更改配置client_max_body_size没有生效

在nginx使用过程中,上传文件的过程中,通常需要设置nginx报文大小限制。避免出现413 Request Entity Too Large。 于是奇葩的问题被我们遇到了,详细配置请参考下面。我们...

nginx设置请求body大小

client_max_body_size 100M;

nginx日志记录post的参数

nginx的日志通过调整log_format格式可以记录所有请求信息 回答群里盆友一个问题 nginx 日志,可以记录post的参数吗? 答:可以实现,通过设置log_format指令的参数。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nginx 获取 post body值
举报原因:
原因补充:

(最多只允许输入30个字)