我是靠谱客的博主 温暖背包,最近开发中收集的这篇文章主要介绍nginx 获取 post body值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 获取 post body值的全部内容,希望文章能够帮你解决nginx 获取 post body值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部