文章目录
一、Rewrite概述
1.Rewrite规则的作用
Rewrite又称地址重定向,可以对实现url的重写,以及重定向
2.Rewrite跳转场景
- URL看起来更规范,合理
- 企业会将动态URL地址伪装为静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上
- 服务端某些业务调整
3.Rewrite实际场景
3.1 Nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配在跳转
3.2 Rewrite放在server{},if{},location{}段中(比较重要,需牢记)
- location只对域名后边的除去传递参数外的字符串起作用
3.3 对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_pass反向代理
二、Nginx正则表达式
1.常用的正则表达式元字符
2.正则匹配的常用表达式
三、Rewrite命令
1.命令语法
rewrite <regex> <replacement> [flag];
正则 跳转后的内容 rewrite支持的flag标记
flag标记说明
2.last和break比较
四、location概述
1.location的匹配
location = patt {} [精确匹配]
location patt{} [一般匹配]
location ~patt{} [正则匹配]
2.location优先级
相同类型的表达式,字符串的会优先匹配
按优先级排列
- = 类型
- ^~ 类型表达式
- 正则表达式(~ 和 ~*)类型
- 常规字符串匹配的类型,按前缀匹配
- 通用匹配(/),如果没有其他匹配,任何请求都会匹配到
注:执行顺序是从上到下
3.location优先级规则
3.1 相同点
- 都能实现跳转
3.2 不同点
- rewrite是在同一域名内更改获取资源的路径
- location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
3.3 rewrite会卸载location里,执行顺序
- 执行server块里面的rewrite指令
- 执行locationpipei
- 执行选定的location中的rewrite指令
五、应用示例
注:每做一个功能后记得初始化Nginx环境,避免前面的功能与后面的配置文件冲突
1.基于域名的跳转
现在公司旧域名www.fa.com有业务需求有变更,需要使用新域名www.newfa.com代替。
先去本机的C:\Windows\System32\drivers\etc中的hosts文件中添加IP与新的域名
注:如保存不了就另存到桌面上,删除文件中的文本,把桌面上的复制过来,hosts的后缀.txt记得去掉,然后重启服务
1.修改默认站点位置
vi /etc/nginx.conf
nginx -t #检查语法
添加:
server {
listen 80;
server_name localhost;
if ($host = 'www.fa.com')
{
rewrite ^/(.*)$ http://www.newfa.com/$1 permanent;
}
2.添加新域名www.netfa.com的站点位置(末尾加)
vi /usr/local/nginx/conf/nginx.conf
nginx -t
添加:
server {
listen 80;
server_name www.newfa.com;
charset utf-8;
access_log /var/log/nginx/www.newfa.com-access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@server1 ~]mkdir /var/log/nginx
[root@server1 ~]mkdir -p /usr/share/nginx/html
[root@server1 ~]echo "Hello Fa" > /usr/share/nginx/html/index.html
[root@server1 ~]# systemctl restart nginx
测试:
www.netfa.com
2.基于客户端IP访问
其他IP访问公司网站都显示维护页面,只有公司IP访问正常
假设服务器IP为20.0.0.14,公司IP为20.0.0.13
1.修改配置文件,添加重定向
[root@server1 ~]# vi /etc/nginx.conf
添加:
server {
listen 80;
server_name www.fa.com;
set $rewrite true; ###判断标志$rewrite
if ($remote_addr = "20.0.0.13") { #允许公司内部访问,更改标志位false(这样不会执行下面if判断的rewrite了)
set $rewrite false;
}
if ($rewrite = true) {
rewrite (.+) /newfa.html; ##如果不是公司IP,则重定向到维护页面
}
charset utf-8;
access_log logs/old.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
2.检查语法与创建虚拟ip
[root@server1 ~]# vi /etc/hosts
20.0.0.13 www.fa.com www.newfa.com
[root@server1 ~]# nginx -t
[root@server1 ~]# ifconfig ens33:1 20.0.0.19
[root@server1 ~]# ifconfig
[root@server1 ~]# systemctl restart nginx
3.添加一个维护网页
[root@server ~]# vi /usr/local/nginx/html/newfa.html
Website is Maintaining,Please visit later!!! 维护中
测试:
使用20.0.0.13主机访问www.old.com,可以访问原网页
使用其他主机访问直接会提示维护中
3.基于旧域名与新域名跳转并加目录
将域名www.fa.com下的所有发帖都跳转到www.newfa.com/fa,且域名跳转后保持参数不变
1.添加重定向
[root@server1 ~]# vi /etc/nginx.conf
[root@server1 ~]# nginx -t
2.末尾添加新域名
[root@server1 ~]# vi /etc/nginx.conf
[root@server1 ~]# nginx -t
3.在服务器里创建fa内页面
[root@server1 html]# vi /etc/nginx.conf
[root@server1 html]# systemctl restart nginx
[root@server1 html]# cd
[root@server1 ~]# cd /usr/local/nginx/html/
[root@server1 html]# mkdir -p fa/post
[root@server1 html]# cd fa/post
[root@server1 post]# vi 1.html
[root@server1 post]# cat 1.html
添加:
Hello work!
[root@server1 post]# cat /etc/hosts
添加:
20.0.0.13 www.fa.com www.newfa.com
测试:
http://www.fa.com/post/1.html 会自动跳转到www.newfa.com新页面
4.基于参数匹配的跳转
1.修改配置文件
[root@server ~]# vi /etc/nginx.conf
添加:
server {
listen 80;
server_name www.newfa.com;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.*) http://www.newfa.com permanent;
}
charset utf-8;
access_log logs/newfa.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
2.检查语法
[root@server ~]# vi /etc/hosts
20.0.0.13 www.newfa.com
[root@server ~]# nginx -t
[root@server ~]# systemctl restart nginx
测试
访问www.newfa.com/100-100-10.html,会跳转www.newfa.com
访问www.newfa.com/100-300-10.html,超出匹配范围不会跳转www.newfa.com
5.基于目录下所有php文件跳转
访问http://www.newfa.com/upload/1.php跳转到首页
1.修改配置文件
[root@server ~]# vi /etc/nginx.conf
添加:
server {
listen 80;
server_name www.newfa.com;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.newfa.com permanent;
}
charset utf-8;
access_log logs/newfa.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
2.检查语法
[root@server ~]# vi /etc/hosts
20.0.0.13 www.newfa.com
[root@server ~]# nginx -t
[root@server ~]# systemctl restart nginx
测试:
访问http://www.newfa.com/upload/1.php,会跳转www.newfa.com
6.基于最普通url请求的跳转
访问一个具体的页面跳转到首页,如浏览器访问http://www.newfa.com/1/newfa.html跳转到首页
1.修改配置文件
[root@server ~]# vi /etc/nginx.conf
添加:
server {
listen 80;
server_name www.newfa.com;
location ~* ^/1/test.html {
rewrite (.+) http://www.newfa.com permanent;
}
charset utf-8;
access_log logs/newfa.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
2.检查语法并重启服务
[root@server ~]# vi /etc/hosts
20.0.0.13 www.newfa.com
[root@server ~]# nginx -t
[root@server ~]# systemctl restart nginx
测试:
访问http://www.newfa.com/1/newfa.html,会跳转www.newfa.com