V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
ladyv2
V2EX  ›  NGINX

Nginx if is evil。。。这种情况下怎么避免用 if

  •  
  •   ladyv2 · 2016-05-11 21:23:17 +08:00 · 3731 次点击
    这是一个创建于 3118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要记录 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 ,上面的这种写法应该是不推荐 那么,有没有什么更好的方法来实现这个需求呢?

    17 条回复    2016-05-12 12:07:47 +08:00
    lightening
        1
    lightening  
       2016-05-11 21:27:32 +08:00
    我也有这个疑问。我不是 Nginx 配置专家,但是网上查过,好像查不到把 POST 独立出来作为一个 location 的方法。
    des
        2
    des  
       2016-05-11 21:35:39 +08:00
    可以判断 Content-Type 是不是等于 multipart/form-data ,是就不记录

    建议你们用 php 来记录, nginx 不是做这个事的
    ladyv2
        3
    ladyv2  
    OP
       2016-05-11 21:39:16 +08:00
    @lightening 我这个方法其实已经独立出来了,但是必然用到 if 了。。。所以想集思广益看看有没有更好的办法
    ladyv2
        4
    ladyv2  
    OP
       2016-05-11 21:40:25 +08:00
    @des php 记录不是最好的方法
    我们记录 post 内容其实也是出于安全的考虑, post 都记录下来,这样如果被黑什么的,可以根据 post 数据定位漏洞
    而使用 php 记录的话,太容易被绕过了。
    extreme
        5
    extreme  
       2016-05-11 21:53:52 +08:00
    1. 用 rewrite 另外弄一个 URL 接收 POST 上传的图片。
    2. location 那个 URL 。
    dorentus
        6
    dorentus  
       2016-05-11 21:54:05 +08:00 via iPhone
    如果一定要在 nginx 里面做这个的话,他们似乎都是加上 lua 模块用 lua 写这些逻辑的
    sagnitude
        7
    sagnitude  
       2016-05-11 22:38:36 +08:00   ❤️ 1
    ladyv2
        8
    ladyv2  
    OP
       2016-05-12 08:07:55 +08:00
    @sagnitude

    if arg then
    ngx.exec("@flash")
    else
    这个地方应该是 if arg_mod = "upload"吧。

    lua 目前还没学,先请教下
    sagnitude
        9
    sagnitude  
       2016-05-12 08:30:34 +08:00
    @ladyv2 local arg = ngx.var.arg_upload 就是取 uri 参数
    ladyv2
        10
    ladyv2  
    OP
       2016-05-12 09:00:33 +08:00
    @sagnitude 收到
    是不是 lua 里的 if 可以多个条件
    sagnitude
        11
    sagnitude  
       2016-05-12 10:15:12 +08:00
    ladyv2
        12
    ladyv2  
    OP
       2016-05-12 10:29:54 +08:00
    @sagnitude
    不好意思另外一个问题
    lua 怎么获取 user-agent 做判断? 试着找了下文档似乎需要读取 header?
    sagnitude
        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
    sagnitude
        14
    sagnitude  
       2016-05-12 10:43:55 +08:00
    surfire91
        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;
    }
    ladyv2
        16
    ladyv2  
    OP
       2016-05-12 11:59:11 +08:00
    @surfire91 这个不现实
    现在各种 php 都是统一入口,比如说像 wp ,是 index.php?**
    根据后面的参数来执行各种操作。所以只能通过 uri 来判断
    surfire91
        17
    surfire91  
       2016-05-12 12:07:47 +08:00
    @ladyv2 用 rewrite 转一下呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:59 · PVG 15:59 · LAX 23:59 · JFK 02:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.