标题:将不同的HTTP User Agent请求转发到特定的后端服务器 出处:沧海一粟 时间:Mon, 28 May 2012 10:39:21 +0000 作者:jed 地址:http://www.dzhope.com/post/922/ 内容: 假设我这里有大量图像、CSS、javascript等静态文件,分别放在后端服务器 192.168.1.5 和 192.168.1.6上,那么我如何利用nginx的反向代理功能将不同的 http_user_agent 请求发送到指定的服务器上呢?如 "Mozilla" 转发到 192.168.1.5 ,MSIE 转发到 192.168.1.6 。 Nginx web 服务器支持if条件表达式,由此来跳转或者使用不同的配置变量。在本文中需要使用 $http_user_agent 变量,它标记了用户浏览器的类别,版本以及操作系统的一些信息,语法如下: if ( condition ){ do_something } if ( $http_user_agent = "wget" ){ do_something } if ( $http_user_agent ~ MSIE ){ return 403; } if指令会就检查后面表达式的值是否为真(true),如果为真,则执行后面大括号中的内容。以下是一些条件表达式的比较方法: 1、变量的完整比较可以使用=或!=操作符 2、 部分匹配可以使用正则表达式来表示,~或~* 3、~表示区分大小写 4、~*表示不区分大小写(firefox与FireFox是一样的) 5、!~与!~* 是取反操作,也就是不匹配的意思 6、检查文件是否存在使用 -f 或 !-f 操作符 7、检查目录是否存在使用-d或!-d操作符 8、检查文件,目录或符号连接是否存在使用-e或!-e操作符 9、检查文件是否可执行使用-x或!-x操作符 10、正则表达式的部分匹配可以使用括号,匹配的部分在后面可以用$1~$9变量代替,这些和apache一致。 例子: 编辑 /usr/local/nginx/conf/nginx.conf 文件 #vi /usr/local/nginx/conf/nginx.conf 设置upstream服务器: upstream myproxybackend { server 192.168.1.1; server 192.168.1.2; server 192.168.1.3; server 192.168.1.4; } upstream msiebackend { server 192.168.1.6; } upstream mozillabackend { server 192.168.1.5; } 更新虚拟主机配置文件 server { access_log logs/access.log; error_log logs/error.log; index index.html; listen 202.54.1.5:80 default; root /usr/local/nginx/html; server_name example.com www.example.com 0.example.com; ## PROXY - Web location / { proxy_pass http://myproxybackend; if ($http_user_agent ~ MSIE ) { proxy_pass http://msiebackend; } if ($http_user_agent ~ Mozilla ) { proxy_pass http://mozillabackend; } proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; # many more... # many more... } 最后重启/重新载入nginx #/usr/local/nginx/sbin/nginx -s reload Generated by Bo-blog 2.1.1 Release