Nginx map指令匹配 User Agent 自定义值例子

本文介绍有关 User-Agent 的知识,以及使用 Nginx map 指令配合正则表达式匹配 User Agent 自定义值,通过捕获 UA 自定义值,可以做很多事情,其中一个场景是:让一台测试机支持多个测试同时测试一个项目,原理就是匹配 UA 值,设置不同的 WEB 根目录。

关于 User Agent

User Agent 中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

用 Firefox的 Firebug 工具可以看到每次请求的请求头信息都包含 User-Agent 字段,如图所示:

通过查看 nginx 的请求日志如 access.log,也可以查看到每次请求的 UA 信息,如果是 curl 命令方式请求,可以看到 UA 信息是 curl:

192.168.10.1 – – [10/Oct/2016:02:42:59 +0000] “GET /hello HTTP/1.1” 200 18 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng”
127.0.0.1 – – [10/Oct/2016:02:43:23 +0000] “GET /hello HTTP/1.1” 200 22 “-” “curl/7.35.0”

Firefox 插件:User Agent Switcher

这个插件可以管理和切换不同的 User-Agent,比如模拟不同的浏览器,或者新增自定义的 UA,可以在 UA 中带上自己的标识。

比如新增一个自己的 UA,并加上自己的标识,如图:


 

 

这样 Firefox 发出的请求头信息中 UA 就是这个修改过后的,访问一个本地 WEB 项目,通过 firebug 或查看 nginx 的 access.log 日志,都可以发现请求 UA 发生了变化。

Nginx 配置匹配 User-Agent

在 nginx 配置文件中,$http_user_agent 表示 UA 的值,比如浏览器默认 UA 值是:

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

现在新增了一个 UA,UA 值是在后面加一个空格和名字,如:

Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng

通过 Firefox 的 User Agent Swicher 这个插件切换到新的 UA,再通过浏览器访问,UA 就是这个修改之后的。

那么,在 nginx 中如何匹配这个最后的名字呢?这里可以用到 nginx 的 map 指令配合正则表达式。

map 指令正则匹配

map 指令使用 ngx_http_map_module 模块提供的,ngx_http_map_module 模块可以创建变量,这些变量的值与另外的变量值相关联。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map 指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。
在 nginx 的 http 域中,增加以下代码:

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

这里正则表达式 [\S]+$ 即匹配最后一个非空白字符,?<name> 表示要匹配的结果用 $name 表示。

这个 map 域的意思是,匹配对象是 $http_user_agent,即 UA,默认 $user 值是空字符串,如果是 curl 开头的,$user 值就是 curl,如果可以匹配到最后一个非空字符串,那么 $user 的值就是这个最后的字符串。

在 server 域中添加如下测试代码:

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

执行 curl 命令:curl www.tanteng.me/hello

返回结果:

http_user_agent:curl/7.35.0
user:curl

在浏览器中访问,输出结果是:

http_user_agent:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng
user:tanteng

这样就成功获取到 UA 后面增加的一个值。

Nginx 根据不同的 UA 设置网站根目录

通过 map 指令获取到 UA 自定义值后,可以做如下设置,让不同的测试人员对应不同的网站根目录:

location ~ \.php$ {
    try_files      $uri =404;
    root           /usr/share/nginx/html/$user/public;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

这里 root 行,网站目录可以用 $user 变量来表示。比如测试人员 ruike,他修改自己的 UA 后面加上 ruike,那么访问的网站根目录是 /usr/share/nginx/html/ruike/public,这样不同的测试人员在自己的各自目录拉取代码,互不影响,支持同时进行测试。

测试一下效果,把 public 下的 index.php 文件前面用 echo ‘wo shi ruike.’;exit; 输出。

切换到 ruike 这个 UA,访问网站,显示的即是以上内容,切换回 tanteng 这个 UA,显示的是正常的网站内容,这就达到了通过 UA 自定义值设置不同的网站根目录的效果,也就支持了一台测试机支持不同的测试人员同时进行测试的需求。

时间: 2024-10-22 18:31:59

Nginx map指令匹配 User Agent 自定义值例子的相关文章

Nginx map 指令实现页面重定向的例子

有时候网站 URL 规则会进行调整,需求的不断变化也会导致一些旧的 URL 无法访问,这个时候可以使用 Nginx 的 map 指令匹配这些旧的 URL,并重定向到新的 URL 规则,而且这种方式是在 Nginx 层面进行,不会对网站性能产生影响. 在 nginx.conf 的 http 域中添加 map 指令规则,这里包含一个 URL 规则映射文件: # 设置301跳转 map $request_uri $new {     include /etc/nginx/redirect.map; }

nginx location 指令匹配顺序

location 指令语法如下:  代码如下 复制代码 location [=|^~|~|!~|~*|!~*] uri { } 上述配置中[]内为可选配置,但只能使用其中一个.关于具体含义,可以参考:nginx 匹配操作符.uri可以是普通字符串或正则表达式. 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式.另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式

利用Nginx的map指令实现页面跳转_nginx

前言 本文主要介绍了利用Nginx中map指令实现页面跳转的方法,有需要的下面来一起学习学习. 实现方法 在 nginx.conf 的 http 域中添加 map 指令规则,这里包含一个 URL 规则映射文件: # 设置301跳转 map $request_uri $new { include /etc/nginx/redirect.map; } map 指令支持引入一个映射文件的方式,这里 redirect.map 文件内容格式如下: ~^/page/mordern-php$ /page/mo

Nginx配置指令location匹配符优先级和安全问题

使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";"号,语句块用"{}"括起来. 配制好,直接nginx -t 检查配制情况,配制成功,直接运行:service nginx reload .服务器没有任何宕机情况下,实现平稳修改配置 最近一直在做location 配置,遇到优先级别问题(如果配置不当可能存在安全隐患哦),以下是个人学习一点体会. 一. location 的匹配符1.等于匹配

Nginx 配置指令的执行顺序(一)

大多数 Nginx 新手都会频繁遇到这样一个困惑,那就是当同一个 location 配置块使用了多个 Nginx 模块的配置指令时,这些指令的执行顺序很可能会跟它们的书写顺序大相径庭.于是许多人选择了"试错法",然后他们的配置文件就时常被改得一片狼藉.这个系列的教程就旨在帮助读者逐步地理解这些配置指令背后的执行时间和先后顺序的奥秘.       现在就来看这样一个令人困惑的例子:     ? location /test {    ?     set $a 32;    ?     e

Nginx之location 匹配规则详解

关于一些对location认识的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是"先匹配普通,再匹配正则".我这么说,大家一定会反驳我,因为按"先匹配普通,再匹配正则"解释不了大家平时习惯的按"先匹配正则,再匹配普通"的实践经验.这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,后面会详细解释).   2. locatio

Nginx 配置指令的执行顺序(九)

紧接在 server-rewrite 阶段后边的是 find-config 阶段.这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作.换句话说,在此阶段之前,请求并没有与任何 location 配置块相关联.因此,对于运行在 find-config 阶段之前的 post-read 和 server-rewrite 阶段来说,只有 server 配置块以及更外层作用域中的配置指令才会起作用.这就是为什么只有写在serve

正则表达式,匹配一个范围的值用分号隔开,也可以是单独的一个值

问题描述 正则表达式,匹配一个范围的值用分号隔开,也可以是单独的一个值 匹配1-31的值,可以是1,2,3,4,5 还可以是1 这样的类型 输入的值要在1到31之间: 比如输入:1,2,3,31 返回true 输入1,2,32返回false 输入2返回true 输入32返回false 解决方案 void Main() { var arry=new string[]{"1,12,3,31", "1", "1,12,32", "2"

struts2.0-Struts2 map 与 原生域对象 属性值的问题

问题描述 Struts2 map 与 原生域对象 属性值的问题 往域对象的相对应的map 对象里,存入数据.. 在相对应的 原生域对象 也会存入该数据吗? 域对象的属性 和 map是同步吗? 是不是域对象 里的属性的增删 ,会同步映射到响应的 map中,但是map中的 属性增删 不会 对域对象产生影响是嘛?? 解决方案 建议你去跟踪一下源码,你就知道了,struts2最终还是把map里面的值对应的存在域中. 解决方案二: 对,都是默认完成的 就像action里不加class属性,同样会执行一样