nginx跳转

rewrite跳转

nginx服务基于http协议rewrite重写mudule模块进行跳转。

rewrite跳转使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL(我们访问的完整域名+路径)重写以及重定向。

跳转循环最多可以执行10次,超过后nginx将返回500错误。

rewrite跳转的应用场景:
1、让URL看起来更规范合理
2、 将动态URL地址伪装成静态地址提供服务
3、 网址换新域名后,用户可以通过访问旧域名跳转到新的域名上
4、 企业的某些服务进行合并,使用跳转将业务进行统一

rewrite跳转的实现方式

rewrite放在server{}、location{}、if{}字段中使用。
在server{}字段中对整个服务生效。
在location字段中只对location匹配到的内容生效。
在if{}字段中对符合if{}判断的进行生效,不过与脚本中的if不同,这里只支持单分支且格式有一定区别。

也可以反向代理把请求跳转给后端服务器,通过定义一个后端服务器的ip地址池,再通过location字段匹配跳转。

#举例:
#定义一个apache服务器地址池
upstream apache_server {                   
apache-1_ip:端口
apache-2_ip:端口
}

#location匹配跳转至apache服务器
location {
proxy_pass apache_server
}

rewrite语法

#跳转按照rewrite 正则 指向的url flag标记 这种格式书写,如果不写flag默认为last
#下面是举例:
rewrite ^~/ http://www.shiki.com/rougi.jpg permanent;

flag标记说明:
last:表示完成这一条rewrite,一般写在server和if中。
break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中。
redirect:返回302 临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url。
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

跳转的匹配优先级

匹配优先级按照越精确优先级越高来进行。举个例子,寻找一个大楼中的某一个人,当然是对房间内的人进行寻找>对整个楼层进行寻找>对整栋楼进行寻找。
跳转进行的匹配有三种,按照优先级排序为:
1:精确匹配类型"="
2:正则表达式类型"~"
3:通用匹配类型"/"
值得注意的是,在第二和第三种匹配类型中有一个^,^和~或/搭配,这个的优先级凌驾于同级别的其他匹配类型,但是比上一级别的优先级要低,而且这个匹配匹配到时不在匹配其他location。在同级别的匹配中url越长的匹配优先级越高。

对文件和对目录的匹配优先级稍微有点不同。
对文件:
(location = 完整路径)>(location ^~完整路径) >(location ~完整路径) >(location ~完整路径)>( location完整路径)>(location/)
对目录:
(location =目录) >(location ^~目录/)>(location ~目录) >(location ~*目录) >(location目录) >(location /)

跳转中的正则表达式

在nginx跳转中,正则所表达的意思与shell脚本中表达的意思不完全一致。
正则匹配常用的一些表达式:
~:执行一个正则匹配,区分大小写。
~*:执行要给正则匹配,不区分大小写。
!~:执行一个正则匹配,区分大小写匹配到的不进行匹配。
!~*:执行一个正则匹配,不区分大小写匹配到的不进行匹配。
^~:使用前缀匹配,如果匹配成功不再匹配其他location。
=:普通字符精确匹配。
@:定义一个命名的location,用于内部定向。

nginx中其他的正则表达式和shell脚本中表示的差不多,这里也一并列出来:
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符0次或多次
+:匹配前面的字符1次或多次
?:匹配前面的字符0次或1次
. :匹配除“\n”之外的任何单个字符;字母,数字,符号都包含
\:将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用;使用诸如"[.\n]" 之类的模式,可匹配包括"\n" 在内的任意字符
\w:匹配字母或数字或下划线或汉字
\s:匹配任意的空白符
\b:匹配单词的开始和结束
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
[]:定义匹配的字符范围
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个
():表达式的开始和结束
|:或的运算符

nginx中的内置变量

$args:这个变量等于请求行中的参数。
$content_length:请求头中的Content-length字段。
$content_type:请求头中的Content-Type字段。
$document_root:当前请求在root指令中指定的值。
$host:请求主机头字段,否则为服务器名称。
$http_user_agent:客户端agent信息
$http_cookie:客户端cookie信息
$limit_rate:这个变量可以限制连接速率。
$request_body_file:客户端请求主体信息的临时文件名。
$request_method:客户端请求的动作,通常为GET或POST。
$remote_addr:客户端的IP地址。
$remote_port:客户端的端口。
$remote_user:已经经过Auth Basic Module验证的用户名。
$request_filename:当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string:与$args相同。
$scheme:HTTP方法(如http,https)。
$server_protocol:请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr:服务器地址,在完成一次系统调用后可以确定这个值。
$server_name:服务器名称。
$server_port:请求到达服务器的端口号。
$request_uri:包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri:不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri:与$uri相同。

rewrite实验

1、基于域名的跳转

#进入hosts文件,添加ip地址和域名的映射
vim /etc/hosts
192.168.214.215 www.shiki.com www.ryougi.com

#然后进入nginx的主配置文件,在location字段中添加if判断,如果访问www.shiki.com就执行跳转
location / {
        if ($host = 'www.shiki.com') {
           rewrite ^/(.*)$ http://www.rougi.com permanent;
        }   
            root   html;
            index  index.html index.htm;
        }
#最后重启服务

访问旧域名
在这里插入图片描述
可以看到成功跳转到新域名
在这里插入图片描述

2、基于ip访问跳转

要求客户端访问显示一个网页,本机访问显示原网页

#首先给所有ip地址的布尔值标为true,其次当访问来源是本机时,布尔值标为flase不进行跳转,最后对布尔值为true的访问来源跳转到另一个网页

#创建一个网页文件
mkdir -p /var/www/html
echo '<h1>this is locked!</h1>' > /var/www/html/locked.html

#进入nginx配置文件
set $rewrite true;
        if ($remote_addr = "192.168.214.215") {
        set $rewrite false;
}
        if ($rewrite = true) {
            rewrite (.+) /locked.html;
}
        location = /locked.html {
           root /var/www/html;
}
        location / {
            root   html;
            index  index.html index.htm;
        }
#最后重启服务

用其他主机访问
在这里插入图片描述
用本机访问
在这里插入图片描述

3、旧域名跳转到新域名的某个目录下的网页

创建一个跳转后的网页文件
mkdir -p /usr/local/nginx/html/214/shiki
[root@localhost ~]# echo "<h1>Ryougi Shiki uio</h1>" >> /usr/local/nginx/html/214/shiki/1.html

#进入nginx配置文件,添加跳转
location /shiki {
            rewrite (.+) http://www.666.com/214$1 permanent;
}

访问旧域名
在这里插入图片描述
最后成功跳转
在这里插入图片描述

4、基于参数匹配的跳转

#如果匹配到带有纯数字参数的url则进行跳转
#进入nginx配置文件
if ($request_uri ~ ^/100-(100|200)-(\d+)\.html$) {
rewrite (.* ) http://www.shiki.com permanent;
}

访问带参数的域名
在这里插入图片描述

成功跳转
在这里插入图片描述

5、对.php为结尾的url进行跳转

#进入nginx配置文件,当匹配到以www.shiki.com/shiki/下任意一个以php为结尾的网页文件进行跳转
location ~* /shiki/.*\.php$ {
            rewrite (.*) http://www.shiki.com permanent;
}

访问一个php结尾的网页
在这里插入图片描述
成功跳转
在这里插入图片描述

6、对普通的url进行跳转

#进入配置文件,如果匹配到www.shiki.com/shiki/1.html则进行跳转
location ~* /shiki/1.html {
            rewrite (.*) http://www.shiki.com permanent;
}

访问www.shiki.com/shiki/1.html
在这里插入图片描述
成功跳转
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值