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,匹配以/开头100200,匹配次数至少一次,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
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值