使用 Nginx map 指令匹配 User Agent 自定义值

使用 Nginx map 指令匹配 User Agent 自定义值

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

 

关于 User Agent

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

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

经过查看 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 中带上本身的标识。bash

好比新增一个本身的 UA,并加上本身的标识,如图:服务器

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

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 自定义值设置不一样的网站根目录的效果,也就支持了一台测试机支持不一样的测试人员同时进行测试的需求。

相关文章
相关标签/搜索