如何在 nginx 用正则表达式提取内容? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tanteng
V2EX    NGINX

如何在 nginx 用正则表达式提取内容?

  •  
  •   tanteng
    tanteng 2016-10-09 18:51:15 +08:00 4626 次点击
    这是一个创建于 3328 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如我把本地浏览器 UA 改成了 Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 name 也就是在后面加个空格和 name

    在 nginx 的配置文件中,我想提取$http_user_agent 中最后这个加的 name

     if ($http_user_agent ~ (这里正则表达式) { set $user "$user"; } 

    这里正则表达式怎么写,或者如何提取$http_user_agent 的后面一个空格和空格后面的 name 呢? 求指教!

    第 1 条附言    2016-10-10 14:29:02 +08:00

    在http域中使用map正则匹配:

    map $http_user_agent $user { default ''; ~curl curl; ~(?<name>[\S]+$) $name; } 

    在server中测试:

    location /hello { echo http_user_agent:$http_user_agent; echo user:$user; } 

    使用 curl 请求,输出 curl 使用浏览器修改UA,在UA后面加空格和名字,如:

    Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 name ,输出 name

    要的就是这个效果。

    能捕捉这个name,可以做好多事情,如一台测试机可以支持多目录拉取网站代码,每个测试通过修改UA+自己名字,访问的是各自的目录。

    第 2 条附言    2016-10-10 15:26:33 +08:00
    12 条回复    2016-10-10 14:29:22 +08:00
    tanteng
        1
    tanteng  
    OP
       2016-10-09 19:11:38 +08:00
    比如 Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng 这个 User-Agent ,用正则 /[ ]([\S]+)/ 可以匹配所有空格+非空格内容,这样会匹配到多个内容,但是 nginx 里怎么取出匹配到的最后一个。
    qq286735628
        2
    qq286735628  
       2016-10-09 19:21:50 +08:00   1
    /[\S]+$/
    查找结尾处非空白字符
    qq286735628
        3
    qq286735628  
       2016-10-09 19:22:23 +08:00
    推荐个学习正则的网站
    https://www.debuggex.com/
    honk
        4
    honk  
       201610-09 19:58:10 +08:00 via Android
    不要直接加 name ,换成 username/xxx , xxx 就是动态的 name
    yangg
        5
    yangg  
       2016-10-09 20:57:59 +08:00   1
    location /echo {
    set $user '';
    if ($http_user_agent ~ (?<user>\S+)$ ) {
    set $user "$user";
    }
    return 200 $user;
    }
    nopicsayjb
        6
    nopicsayjb  
       2016-10-09 21:16:35 +08:00
    下面代码,已测试通过。:)
    if ($http_user_agent ~* "\b(?'baobao'\S\w+$)") {
    set $user "$baobao";
    }
    nopicsayjb
        7
    nopicsayjb  
       2016-10-09 21:19:44 +08:00   1
    再测试一遍。成功, LZ 可以测试下
    if ($http_user_agent ~* "\b(?'baobao'\S\w+)$") {
    set $user "$baobao";
    }
    lhbc
        8
    lhbc  
       2016-10-09 21:44:16 +08:00   1
    楼主你这个需求强烈建议用 map 指令,不要用 if
    ryd994
        9
    ryd994  
       2016-10-10 02:40:56 +08:00 via Android   1
    if 会降低性能并导致各种奇奇怪怪的问题
    用 map
    tanteng
        10
    tanteng  
    OP
       2016-10-10 13:48:11 +08:00
    map 形式怎么写
    ```
    map $http_user_agent $user {
    default '';
    ~curl curl;
    ~[\S]+$ $user;
    }
    ```

    这样只能匹配 curl ,用浏览器就直接 nginx 挂了
    tanteng
        11
    tanteng  
    OP
       2016-10-10 14:00:44 +08:00
    @tanteng 我这样写,通过浏览器进来的就直接挂了,但 curl 方式是 OK 的,[alert] 804#804: worker process 5083 exited on signal 11
    tanteng
        12
    tanteng  
    OP
       2016-10-10 14:29:22 +08:00
    找到解决方法了,对 nginx 不太熟悉,现在 OK 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3042 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:33 PVG 21:33 LAX 05:33 JFK 08:33
    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