nginx-rewrite重写功能
rewrite语法:
指令语法:rewrite regex replacement[flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记
应用场景:
调整用户浏览的URL,看起来规范
为了让搜索引擎收录网站内容,让用户体验更好
网站更换新域名后
根据特殊的变量、目录、客户端信息进行跳转
常用正则表达式
rewrite 最后一项flag参数:
location
location分类
location = patt {} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
location优先级
优先级排列
相同类型的表达式,字符串长的会优先匹配
按优先级排列
= 类型
^~ 类型表达式
正则表达式 (和*)类型
常规字符串匹配类型,按前缀匹配
通用匹配(/),如果没有其他匹配,任何请求都会匹配到
location优先级规则
匹配某个具体文件
location = 完整路径 >
location ^~ 完整路径 >
location ~* 完整路径 >
location ~ 完整路径 >
location完整路径 >
location /
用目录做匹配访问某个文件
location = 目录 >
location ^~ 目录 >
location ~ 目录 >
location ~* 目录 >
location 目录 >
location /
location优先级的示例
location = / { '//精确匹配 /,主机名后面不能带任何字符串'
[configuraion A ]
}
location / { '//所有的地址都以/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配'
[configuraion B ]
}
location /documents/ { '//匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用'
[configuraion C ]
}
location ~ /documents/abc { '//匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才会起作用'
[configuraion D ]
}
location ^~ /images/ { '//以/images/开头的地址,匹配符合后,停止往下匹配'
[configuraion E ]
}
location ~*\.(gif|jpg|gpeg)$ { '//匹配所有以 gif, jpg或jpeg结尾的请求, Images/下的图片会被 [configuration E]处理,因为^~的优先级更高'
[configuraion F ]
}
location /images/abc { '//最长字符匹配到 /images/abc,优先级最低'
[configuraion G ]
}
location ~ /images/abc { '//以/ Images/abc开头的,优先级次之'
[configuraion H ]
}
location /images/abc/1.html { '//如果和正则 ~ images/abc/1.htm相比,正则优先级更高'
[configuraion I ]
}
rewrite与location的比较
相同点
都能实现跳转
不同点
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
基于域名跳转
配置dns,分别配置www.abc.com(old)和www.lcx.com(new)解析
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm #先下载nginx在线源
[root@server1 ~]# yum -y install nginx
#########旧域名www.old.com有变更,需要使用新域名www.new.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变#########
安装bind,配置DNS
[root@server1 ~]# yum -y install bind
[root@server1 ~]# vi /etc/named.conf
options {
listen-on port 53 { 20.0.0.12; }; #修改
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; #修改
[root@server1 ~]# vi /etc/named.rfc1912.zones #新增
zone "abc.com" IN {
type master;
file "abc.com.zone";
allow-update { none; };
};
[root@server1 ~]# cd /var/named/
[root@server1 named]# cp -p named.localhost abc.com.zone
[root@server1 named]# vi abc.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
www IN A 20.0.0.12 #更改最后一行
[root@server1 named]# systemctl start named
简单配置nginx
[root@server1 ~]# rpm -qc nginx #查看nginx目录
server {
listen 80;
server_name www.abc.com; #旧地址
charset utf-8;
access_log /var/log/nginx/abc.com.access.log main;
[root@server1 named]# systemctl start nginx
[root@server1 named]# netstat -ntap | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9089/nginx: master
#此时可以客户机可以进行解析旧地址
[root@server1 ~]# vi /etc/resolv.conf
nameserver 20.0.0.12 #添加至第一行
[root@server1 ~]# nslookup www.abc.com
Server: 20.0.0.12
Address: 20.0.0.12#53
Name: www.abc.com
Address: 20.0.0.12
配置nginx,域名重定向
[root@server1 named]# cd /etc/nginx/conf.d/
[root@server1 conf.d]# vi default.conf
location / {
if ($host = "www.abc.com"){
rewrite ^/(.*)$ http://www.lcx.com/$1 permanent; #匹配以
/为开头,零个或多个字符为结尾的,都视为$1变量,永久重定向为www.lcx.com
}
root /usr/share/nginx/html;
index index.html index.htm;
}
[root@server1 conf.d]# vi /etc/named.rfc1912.zones
zone "lcx.com" IN {
type master;
file "lcx.com.zone";
allow-update { none; };
};
[root@server1 conf.d]# vi /etc/named.rfc1912.zones
[root@server1 ~]# cd /var/named/
[root@server1 named]# cp -p abc.com.zone lcx.com.zone #同一个IP不用更改
[root@server1 named]# systemctl restart named
[root@server1 named]# systemctl stop nginx
[root@server1 named]# systemctl start nginx
浏览器中访问www.abc.com域名会自动跳转到www.lcx.com
基于客户端IP访问跳转
所有IP访问任何内容都显示一个固定维护页面,只有IP(20.0.0.13)访问正常
更改nginx配置文件
[root@server1 ~]# vi /etc/nginx/conf.d/default.conf
设置是否合法的IP标志 #在location前添加
set $rewrite true; #采用布尔值进行标记
#判断是否合法IP
if ($remote_addr = "20.0.0.13"){
set $rewrite false;
}
非法IP进行判断打上标记
if ($rewrite = true){
rewrite (.+) /mian.html
}
匹配标记进行跳转站点
location = /main.html {
root /usr/share/nginx/html;
}
创建跳转网页
[root@server1 ~]# vi /usr/share/nginx/html/main.html
<h1>维护中</h1>
基于旧域名跳转到新域名后面加目录
例如现在访问的是http://www.abc.com/post,现在需要将这个域名下面的发帖都跳转到http://www.lcx.com/bbs注意保持域名跳转后的参数不变
更改nginx配置
[root@server1 html]# vi /etc/nginx/conf.d/default.conf
………………
server_name bbs.abc.com;
………………
location /post {
rewrite (.+) http://www.abc.com/bbs$1 permanent;
}
更改dns配置
[root@server1 ~]# cd /var/named/
[root@server1 named]# ls
abc.com.zone dynamic named.ca named.localhost slaves
data lcx.com.zone named.empty named.loopback
[root@server1 named]# vi abc.com.zone
bbs IN A 20.0.0.12 #更改最后一行
[root@server1 named]# systemctl restart named
[root@server1 named]# systemctl restart nginx
#此时客户机访问bbs.abc.com/post/abc.html会自动跳转到www.abc.com/bbs/post/abc.html
基于参数匹配的跳转
访问http://www.old.com/100-(100|200)-100.html跳转到http://www.new.com页面
配置nginx文件
[root@server1 named]# vi /etc/nginx/conf.d/default.conf
access_log /var/log/nginx/abc.com.access.log main; #后面添加匹配条件
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){ #用内置变量request_uri,匹配以/开头100或200,匹配次数至少一次,html结尾的页面
rewrite (.*) http://www.abc.com permanent;
}
还原abc.com.zone中的www
[root@server1 named]# vi /var/named/abc.com.zone
www IN A 20.0.0.12
[root@server1 named]# systemctl restart named
[root@server1 named]# systemctl restart nginx
浏览器访问www.abc.com/100-100-100.html(这里100或200随便写)会自动跳转到www.abc.com
基于目录下的所有php文件跳转
访问一个具体的页面跳转到首页#########
[root@server1 ~]# vim /etc/nginx/conf.d/default.conf
location ~* /upload/.*\.php$ { #匹配upload零次或多次,以php为结
尾的文件
rewrite (.+) http://www.abc.com permanent;
}
[root@server1 ~]# systemctl restart nginx
访问www.abc.com/upload/abc.php会自动跳转到www.abc.com
具体的页面跳转到首页面
[root@server1 ~]# vi /etc/nginx/conf.d/default.conf
location ~* ^/abc/123.html {
rewrite (.+) http://www.abc.com permanent;
}
浏览器访问www.abc.com/abc/123.html会自动跳转到www.abc.com