晓夏

新手菜鸟Linux学习之路

不怕从零开始,只怕从未启程

关于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


分享:

支付宝

微信