文章目录
基本概念
1: Rewrite跳转场景
- URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上
- 服务端某些业务调整
2:Rewrite实际场景
Nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配再跳转
rewrite放在server,if,location段中
- location只对域名后边的除去传递参数外的字符串起作用
对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_pass反向代理
3:Nginx正则表达式
4:Rewrite命令
Rewrite命令语法
rewrite <regex>正则 <replacement>跳转后的内容 [flag]rewrite支持的flag标记;
flag标记说明
last和break比较
5:location优先级
1:相同类型的表达式,字符串长的会优先匹配
2:按优先级排列
- =类型
- ^~类型表达式正则表达式 ( ~ 和 ~*)类型
- 常规字符串匹配类型,按前缀匹配
- 通用匹配 (/),如果没有其它匹配,任何请求都会匹配到
6:比较rewrite和 location
相同点
- 都能实现跳转
不同点
- rewrite是在同—域名内更改获取资源的路径
- location是对—类路径做控制访问或反向代理,还可以proxy pass到其他机器
rewrite会写在location里,执行顺序
- 执行server块里面的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
7:location优先级规则
匹配某个具体文件
用目录做匹配访问某个文件
跳转方式
1:基于域名的跳转
公司旧域名www.aa.com,因业务需求有变更,需要使用新域名www.newaa.com代替
- 不能废除旧域名
- 从旧域名跳转到新域名,且保持其参数不变
第一步:修改默认站点配置文件
[root@server2 ~]# vi /etc/nginx.conf
server {
listen 80;
server_name www.aa.com;
if ($host = 'www.aa.com')
{
rewrite ^/(.*)$ http://www.newaa.com/$1 permanent;
}
access_log logs/www.aa.access.log main;
第二步:添加新域名 www.newaa.com 的站点位置
最后面添加
server {
listen 80;
server_name www.newaa.com;
charset utf-8;
access_log /var/log/nginx/www.newaa.com-access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@server2 ~]# mkdir /var/log/nginx
第三步:添加测试文件并重启
[root@server2 ~]# mkdir -p /usr/share/nginx/html
[root@server2 ~]# echo "this is my web." > /usr/share/nginx/html/index.html
[root@server2 ~]# cat /usr/share/nginx/html/index.html
this is my web.
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第四步:客户机做域名映射
第五步:验证效果
- 浏览器访问:www.aa.com
2:基于客户端 IP 访问跳转
(还原上一个实验配置)
今天公司业务版本上线,所有IP访问任何内容都显示一个固定维护页面,只有公司IP访问正常
第一步:修改默认站点配置文件
[root@server2 ~]# vi /etc/nginx.conf
server {
listen 80;
server_name www.aa.com;
set $rewrite true;
if ($remote_addr = "20.0.0.11") {
set $rewrite false;
}
if ($rewrite = true) {
rewrite (.+) /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
}
第二步:修改需要重定向的网页
[root@server2 ~]# vi /usr/share/nginx/html/maintenance.html
Webside is bad,please later new.
第三步:重启 Nginx
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第四步:验证效果
本机访问
客户机访问
将本机地址修改,本机浏览器访问,也会出现客户机访问的界面
[root@server2 ~]# ifconfig ens33 20.0.0.20
[root@server2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.20 netmask 255.0.0.0 broadcast 20.255.255.255
inet6 fe80::5cbb:1621:4281:3b24 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:77:39 txqueuelen 1000 (Ethernet)
RX packets 11071 bytes 3038503 (2.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7236 bytes 970327 (947.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@server2 ~]# vi /etc/hosts
20.0.0.20 www.aa.com
3:基于旧、新域名跳转并加目录
将域名http://bbs.aa.com下面的发帖都跳转到http://www.aa.com/bbs且域名跳转后保持参数不变
第一步:修改默认站点配置文件
[root@server2 ~]# vi /etc/nginx.conf
最后添加
server {
listen 80;
server_name bbs.aa.com;
charset utf-8;
access_log logs/bbs.aa.access.log main;
location /post {
rewrite (.+) http://www.aa.com/bbs$1 permanent;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
[root@server2 ~]# cd /usr/local/nginx/html/
[root@server2 html]# mkdir -p bbs/post
[root@server2 html]# cd bbs/post/
[root@server2 post]# vi 1.html
hello,this is my wab.
第二步:重启 Nginx
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第三步:客户机域名映射
[root@server2 ~]# vi /etc/hosts
20.0.0.11 www.aa.com bbs.aa.com
第四步:验证效果
4:基于参数匹配的跳转
第一步:修改站点默认配置文件
[root@server2 ~]# vi /etc/nginx.conf
server {
listen 80;
server_name www.aa.com;
charset utf-8;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.*) http://www.aa.com permanent;
}
access_log logs/www.aa.access.log main;
第二步:重启 Nginx
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第三步:效果验证
5:基于目录下所有 PHP 文件跳转
第一步:修改站点默认配置文件
[root@server2 ~]# vi /etc/nginx.conf
server {
listen 80;
server_name www.aa.com;
charset utf-8;
location ~*/upload/.*\.php$ {
rewrite (.+) http://www.aa.com permanent;
}
第二步:重启 Nginx
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第三步:效果验证
不存在的条件无法跳转
6:基于最普通 url 请求的跳转
第一步:修改站点默认配置文件
[root@server2 ~]# vi /etc/nginx.conf
server {
listen 80;
server_name www.aa.com;
charset utf-8;
location ~* ^/1/test.html {
rewrite (.+) http://www.aa.com permanent;
}
第二步:重启 Nginx
[root@server2 ~]# systemctl stop nginx
[root@server2 ~]# systemctl start nginx
第三步:效果验证
不区分大小写