关于Nginx中手机端访问跳转H5页面以及nginx中的if判断
浏览量:1193
最近公司提出如果手机端访问官网则跳转到H5站的需求,现在我将代码及注释写出来,以便相互学习借鉴,本人小白,大神勿喷!
注意:以下所有配置均写在nginx.conf配置文件中的server中,而且匹配的所有内容均是不带域名的
例如: http://www.guoxin-linux.com/test/1.html 匹配的时候是取/test/1.html
一、Nginx手机端跳转H5站
#注意,这个判断要写在server中的location下 location / { …… #$HTTP_USER_AGENT,这个参数是用来检查浏览页面的访问者在用什么操作系统(包括版本号)、浏览器(包括版本号)访问的. #使用if判断,~是匹配的意思,*代表任意字符或数字特殊符号等,|代表或的意思. #这个判断的意思是匹配用户用什么方式访问的网站,如果是Android或者iPhone或者Windows Phone访问的网站将跳转到H5站 #^/(.*)$是匹配/后面的所有,我是这么理解的。如果不对的话,欢迎纠正支出 if ($http_user_agent ~* "(Android|iPhone|Windows Phone)") { rewrite ^/(.*)$ http://m.9dooo.com break; } …… }
二、Nginx中多层判断
注意:
nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。
还好我们可以用变量的方式来间接实现
location / { …… #set这里为设置nginx变量,下面这句话意思是,设置一个标识符,他的值为0 set $flag 0; #如果requ_uri匹配以/project开头.任意字符的html结尾,括号内的.*为任意字符重复0到无限次, # .在正则中代表任意字符,*则代表重复0到无限次 if ($request_uri ~ '^/project/(.*\.html)$') { #在set里面 ${flag}1是将参数叠加一次,相当于01 set $flag "${flag}1"; } #如果客户端访问通过手机的话,则将flag参数叠加为${flag}2 if ($http_user_agent ~* "(Android|iPhone|Windows Phone)") { set $flag "${flag}2"; } #最后可以通过判断标识位的内容来确定,他需要如何跳转,例如: #012代表他是以/project开头且以.html结尾,并且通过手机访问的 if ($flag = '012') { #重定向: 例如访问地址为/project/1.html ----> http://test.9dooo.com/projectxq2.html?projectId=1 # $1对应(.*)这个括号内匹配的值,假如有$2的话,则对应这段里面第二个()内匹配的值 rewrite ^/project/(.*)\.html$ http://test.9dooo.com/projectxq2.html?projectId=$1 break; } #懂了上面那个,这个就很容易了,02代表不满足访问/project目录下的html页面,但是满足了通过手机访问,这样的话就跳转到H5站 if ($flag = '02') { rewrite ^/(.*)$ http://m.9dooo.com break; } #如果都不满足的话我们可以让他直接反向代理 proxy_pass http://xxxx:xx/; }
三、常用的正则表达式符号
1、基础 ~ 区分大小写匹配 ~* 不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 ^ 以什么开头的匹配 $ 以什么结尾的匹配 2、关于目录操作 -f和!-f用来判断是否存在文件 -d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行 例子: location = / #匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配 location ^~ /images/ { # 匹配任何已/images/开头的 location ~* .(gif|jpg|jpeg)$ { # 匹配任何已.gif、.jpg 或 .jpeg 结尾的请求
关于nginx的if判断以及nginx的变量,我也是今天用到,才临时看的,很多我也不是很明白,可能以后用到的时候在进行更深入的学习吧。
同时也希望能找到更详细的大神博客,来填充自己的小博客,学习更多的知识
部分资料来自于: http://blog.csdn.net/a519640026/article/details/9138487
这里有个大神写的关于重定向的,大家可以去看看: http://blog.csdn.net/zhsh87/article/details/8191264