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

2016-10-09 18:51:15 +08:00
 tanteng

如我把本地浏览器 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 呢? 求指教!

4053 次点击
所在节点    NGINX
12 条回复
tanteng
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
2016-10-09 19:21:50 +08:00
/[\S]+$/
查找结尾处非空白字符
qq286735628
2016-10-09 19:22:23 +08:00
推荐个学习正则的网站
https://www.debuggex.com/
honk
2016-10-09 19:58:10 +08:00
不要直接加 name ,换成 username/xxx , xxx 就是动态的 name
yangg
2016-10-09 20:57:59 +08:00
location /echo {
set $user '';
if ($http_user_agent ~ (?<user>\S+)$ ) {
set $user "$user";
}
return 200 $user;
}
lHUAC
2016-10-09 21:16:35 +08:00
下面代码,已测试通过。:)
if ($http_user_agent ~* "\b(?'baobao'\S\w+$)") {
set $user "$baobao";
}
lHUAC
2016-10-09 21:19:44 +08:00
再测试一遍。成功, LZ 可以测试下
if ($http_user_agent ~* "\b(?'baobao'\S\w+)$") {
set $user "$baobao";
}
lhbc
2016-10-09 21:44:16 +08:00
楼主你这个需求强烈建议用 map 指令,不要用 if
ryd994
2016-10-10 02:40:56 +08:00
if 会降低性能并导致各种奇奇怪怪的问题
用 map
tanteng
2016-10-10 13:48:11 +08:00
map 形式怎么写
```
map $http_user_agent $user {
default '';
~curl curl;
~[\S]+$ $user;
}
```

这样只能匹配 curl ,用浏览器就直接 nginx 挂了
tanteng
2016-10-10 14:00:44 +08:00
@tanteng 我这样写,通过浏览器进来的就直接挂了,但 curl 方式是 OK 的,[alert] 804#804: worker process 5083 exited on signal 11
tanteng
2016-10-10 14:29:22 +08:00
找到解决方法了,对 nginx 不太熟悉,现在 OK 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/311457

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX