Nginx if is evil。。。这种情况下怎么避免用 if - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ladyv2
V2EX    NGINX

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

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

    需要记录 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
    @sanitude
    不好意思另外一个问题
    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     Solana     3206 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:17 PVG 19:17 LAX 03:17 JFK 06:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86