
需要记录 nginx 的 post data
所以需要把 post 单独拿出来。但是网站又有上传头像功能,于是 post data 里把上传的图片也记录了,导致 log 超大
于是想用下面的方法来实现,简单说如果发现 uri 里带 upload ,就内部跳转到不记录 post data 的部分,如果发现是 post 请求,则跳转到记录 post data 的部分
location ~ \.php$ { try_files $uri =404; if ($arg_mod = "upload" ) { return 485; break; } if ($request_method = POST){ return 484; break; } error_page 484 = @post; error_page 485 = @flash; fastcgi_pass backend; } location @post{ internal; access_log /log/post.log postlog; try_files $uri =404; fastcgi_pass backend; } location @flash{ internal; access_log /log/flash.log main; try_files $uri =404; fastcgi_pass backend; } 问题就来了, if is evil ,上面的这种写法应该是不推荐 那么,有没有什么更好的方法来实现这个需求呢?
1 lightening 2016-05-11 21:27:32 +08:00 我也有这个疑问。我不是 Nginx 配置专家,但是网上查过,好像查不到把 POST 独立出来作为一个 location 的方法。 |
2 des 2016-05-11 21:35:39 +08:00 可以判断 Content-Type 是不是等于 multipart/form-data ,是就不记录 建议你们用 php 来记录, nginx 不是做这个事的 |
3 ladyv2 OP @lightening 我这个方法其实已经独立出来了,但是必然用到 if 了。。。所以想集思广益看看有没有更好的办法 |
4 ladyv2 OP @des php 记录不是最好的方法 我们记录 post 内容其实也是出于安全的考虑, post 都记录下来,这样如果被黑什么的,可以根据 post 数据定位漏洞 而使用 php 记录的话,太容易被绕过了。 |
5 extreme 2016-05-11 21:53:52 +08:00 1. 用 rewrite 另外弄一个 URL 接收 POST 上传的图片。 2. location 那个 URL 。 |
6 dorentus 2016-05-11 21:54:05 +08:00 via iPhone 如果一定要在 nginx 里面做这个的话,他们似乎都是加上 lua 模块用 lua 写这些逻辑的 |
7 sagnitude 2016-05-11 22:38:36 +08:00 |
8 ladyv2 OP |
11 sagnitude 2016-05-12 10:15:12 +08:00 |
12 ladyv2 OP |
13 sagnitude 2016-05-12 10:42:37 +08:00 @ladyv2 对, ua 是 http header , ngx.req.get_headers()['User-Agent'],还有个贵一点的方法 ngx.var.http_user_agent |
14 sagnitude 2016-05-12 10:43:55 +08:00 |
15 surfire91 2016-05-12 10:58:07 +08:00 楼主你把区分的因素放到 path 里,而不是放到$arg_xxx 里,这样你就可以通过 location path 来匹配两种规则。 比如: location ~ /upload { access_log /log/post.log postlog; try_files $uri =404; fastcgi_pass backend; } location / { access_log /log/flash.log main; try_files $uri =404; fastcgi_pass backend; } |
16 ladyv2 OP |