【发布时间】:2011-06-23 18:54:16
【问题描述】:
我有我的配置设置来处理一堆 GET 请求,这些请求呈现的像素可以很好地处理分析和解析查询字符串以进行日志记录。使用额外的第三方数据流,我需要处理对给定 URL 的 POST 请求,该 URL 在其请求正文中具有预期的可记录格式的 JSON。我不想使用带有proxy_pass 的辅助服务器,只想将整个响应记录到关联的日志文件中,就像它对 GET 请求所做的那样。我正在使用的一些代码的 sn-p 如下所示:
GET 请求(效果很好):
location ^~ /rl.gif {
set $rl_lcid $arg_lcid;
if ($http_cookie ~* "lcid=(.*\S)")
{
set $rl_lcid $cookie_lcid;
}
empty_gif;
log_format my_tracking '{ "guid" : "$rl_lcid", "data" : "$arg__rlcdnsegs" }';
access_log /mnt/logs/nginx/my.access.log my_tracking;
rewrite ^(.*)$ http://my/url?id=$cookie_lcid? redirect;
}
这有点像我想要做的: POST 请求(不起作用):
location /bk {
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
Curling curl http://myurl/bk -d name=example 给了我一个 404 页面未找到。
然后我尝试了:
location /bk.gif {
empty_gif;
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
冰壶curl http://myurl/bk.gif -d name=example 给了我一个405 Not Allowed。
我当前的版本是nginx/0.7.62。非常感谢任何在正确方向上的帮助!谢谢!
更新 所以现在我的帖子是这样的:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
}
location /dummy { set $test 0; }
它正在正确记录发布数据,但在请求者端返回 404。如果我将上面的代码更改为像这样返回 200:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
return 200;
}
location /dummy { set $test 0; }
然后它正确返回200,但不再记录post数据。
另一个更新 Kinda找到了一个可行的解决方案。希望这可以帮助其他人。
【问题讨论】:
-
你在这方面有什么收获吗?我遇到了类似的问题。
-
不要尝试从虚拟位置执行
set $test 0;,而是尝试从虚拟位置执行return 200;,然后它会按预期返回200,并且我仍然会记录身体。