目录
一、Nginx Rewrite概述
1.1 Rewrite跳转场景
■URL看起来更规范、合理
■企业会将动态url地址伪装成静态地址提供服务
■网址换新域名后,让旧的访问跳转到新的域名上
■服务端某些业务调整
1.2 Rewrite跳转实现
■nginx-----支持url重写、支持if条件判断,但不支持else
■跳转------循环最多可以执行10次,超过后nginx将返回500代码错误
■rewrite------使用nginx’全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
1.3 Rewrite实际场景
■nginx跳转需求的实现方式
●使用rewrite进行匹配跳转
●使用if匹配全局变量后跳转
●使用location匹配再跳转
■rewrite放在 server{},if{},location{}段中
■ 对域名或参数字符串
●使用if全局变量匹配
●使用proxy_pass反向代理
三、location分类
3.1 分类
●location = patt {} [精准匹配]
●location = patt {} [一般匹配]
●location = patt {} [正则匹配]
3.2 location优先级
■相同类型的表达式,字符串长的会优先匹配
■按优先级排列
●= 类型
●^~ 类型表达式
●正则表达式(和*)类型
●常规字符串匹配类型,按前缀匹配
●通用匹配(/),如果没有其他匹配,任何请求都会匹配到
■location优先级的示例
3.3 location优先级规则
■匹配某个具体文件
●(location = 完整路径)> (location ^~ 完整路径)> (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)
■用目录做匹配访问某个文件
●(location = 目录)> (location ^~ 目录/)> (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)
3.4 比较rewrite 和location
■相同点:都能实现跳转
■不同点:
●rewrite是在同一域名内更改获取资源的路径
●location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
■rewrite会写在location里,执行顺序
●执行server块里面的rewrite指令
●执行location匹配
●执行选定的location中的rewrite指令
四、应用场景测试
4.1 基于域名的跳转
■公司旧域名www.51xit.top,因业务需求有变更,需要使用新域名www.52xit.top代替
●不能废除旧域名
●从旧域名跳转到新域名,且保持其参数不变
■在windows里的hosts文件中做映射关系
#先另起一台服务器20.0.0.12,做一个测试网页
[root@www ~]# vi /usr/local/nginx/html/index.html
<html>
<head>
<p><em>这是一个测试网页!</em></p>
</body>
</html>
#再开一台20.0.0.11,修改配置
[root@www ~]# vi /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
if ($host = 'www.51xit.top') {
rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
}
}
[root@www ~]# killall -s HUP nginx #重启
■打开windows浏览器,输入www.51xit.top,会跳到www.52xit.top上
4.2 基于客户端IP访问跳转
■今天公司业务版本上线,所有IP访问任何内容都显示一个固定维护页面,只有公司IP(192.168.100.1)访问正常
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.51xit.top; #改域名
charset utf-8; #改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; #改日志存储路径 去掉main
set $rewrite true; #设置是否合法的IP标志
if ($remote_addr = "192.168.100.1"){ #改客户机的IP地址
set $rewrite false;
}
if ($rewrite = true){
rewrite (.*) /wh.html; #跳转到wh.html
}
location = /wh.html {
root /usr/local/nginx/html; ##存放路径
}
location / {
root html;
index index.html index.htm;
}
[root@www ~]# killall -s HUP nginx #重启
[root@www ~]# echo "网页维护中,请联系管理员" >/usr/local/nginx/html/wh.html
■测试,打开windows浏览器(192.168.100.1),输入192.168.100.20,正常访问;登录客户机192.168.100.100,浏览器输入www.51xit.top,提示"网页维护中,请联系管理员"
4.3 基于旧,新域名的跳转
■现在访问的是http://www.51xit.top/post/,现在需要将这个域名下面的发帖都跳转到http://www.52xit.top/bbs,注意保持域名跳转后的参数不变
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.51xit.top; #改域名
charset utf-8; #改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; #改日志存储路径 去掉main
localtion /post {
rewrite (.+) http://www.52xit.top/bbs$1 permanent;
}
[root@www ~]# killall -s HUP nginx #重启
■测试,输入www.51xit.top/post,显示www.52xit.top/bbs
4.4 基于参数匹配的跳转
■例如现在访问http://www.51xit.top/100-(100|200)-100.html跳转到http://www.51xit.top页面
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.51xit.top; #改域名
charset utf-8; #改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; #改日志存储路径 去掉main
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
rewrite (.*) http://www.51xit.top permanent;
}
[root@www ~]# killall -s HUP nginx #重启
■测试:浏览器输入http://www.51xit.top/100-100-100.html ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/100-200-10.html ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/100-100-100dddd.html ,页面不能跳转
4.5 基于最普通URL请求的跳转
■访问一个具体的页面跳转到首页
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.51xit.top; #改域名
charset utf-8; #改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; #改日志存储路径 去掉main
location ~* ^/1/test.html {
rewrite (.+) http://www.51xit.top permanent;
}
[root@www ~]# killall -s HUP nginx #重启
■测试:浏览器输入http://www.51xit.top/1/test.html ,页面显示http://www.51xit.top
4.6 访问任意一个页面跳转到首页,即http://www.51xit.top/upload/1.php
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.51xit.top; #改域名
charset utf-8; #改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; #改日志存储路径 去掉main
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.51xit.top permanent;
}
[root@www ~]# killall -s HUP nginx #重启
■测试:浏览器输入http://www.51xit.top/upload/1.php ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/upload/bbs/1.php ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/upload/index.html ,页面不跳转