Nginx——Rewrite详解及具体使用场景

Rewrite跳转场景

  • URL看起来更规范、合理

  • 企业会将动态URL地址伪装成静态地址提供服务

  • 网址换新域名后,让旧的访问跳转到新的域名上

  • 服务端某些业务调整

Rewrite跳转实现

在这里插入图片描述

Rewrite使用场景

Nginx跳转需求的实现方式

  • 使用rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用location匹配在跳转

rewrite放在server{},if{},location{}段中

对域名或参数字符串

  • 使用if全局变量匹配
  • 使用proxy_pass反向代理

Nginx正则表达式

匹配规则,处理字符串的工具

字符 说 明
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除"\n"之外的任何单个字符。使用诸如"[.\n]“之类的模式,可匹配包括”\n"在内的任意字符
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个

Rewrite命令

语法:

在这里插入图片描述

flag标记说明:

标记 说明
last 相当于Apache的[L]标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

last和break比较:

last break
使用场景 一般写在server和if中 一般使用在location中
URL匹配 不终止重写后的urI匹配 终止重写后的urI匹配

location分类

分类:

  • location = patt {} [精准匹配]
  • location patt {} [一般匹配]
  • location ~ patt {} [正则匹配]

正则匹配的常用表达式:

标记 说明
~ 执行一个正则匹配,区分大小写
~* 执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,区分大小写不匹配
!~* 执行一个正则匹配,不区分大小写不匹配
^~ 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
= 普通字符精确匹配。也就是完全匹配
@ 定义一个命名的location,使用在内部定向时

location优先级

相同类型的表达式,字符串长会优先匹配

按优先级排序:

  • = 类型
  • ^~ 类型表达式
  • 正则表达式 (*) 类型
  • 常规字符串匹配类型,按前缀匹配
  • 通用匹配(/),如果没有其他匹配,任何请求都会匹配

比较rewrite和location

相同点:都能实现跳转

不同点:

  • rewrite是在同一域名内更改获取资源的路径
  • location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器

rewrite会写在location里,执行顺序

  • 执行server块里面的rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite指令

Location优先级示例

location =/ {					//精确匹配/,主机名后面不能带任何和字符串
[ configueation A ]
}

location / {			//所有的地址都已/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配
[ configueation B ]
}

location /documents/ {		//匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用
[ configueation C ]
}

location ~ /documents/abc {		//匹配任何以/documents/abc开头的地址,放后面的正则表达式没有匹配到时,才会起作用
[ configueation D ]
}

location ^~ /images/ {			//以/images/开头的地址,匹配符合后,停止往下匹配
[ configueation E ]
}

location ~* \.(gif|jpg|jpeg)$ {  	//匹配所有以gif,jpg或jpeg结尾的请求,/images/下的图片会被[ configueation E ]处理,因为^~的优先级更高
[ configueation F ]
}

location /images/abc {			//最长字符匹配到/images/abc,优先级最低
[ configueation G ]
}

location ~ /images/abc {		//以/images/abc开头,优先级次之
[ configueation H ]
}

location /imahes/abc/1.html {	//如果和正则~ /imahes/abc/1.html相比,正则优先级更高
[ configueation I ]
}

location优先级规则

匹配某个具体文件

(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)

用目录做匹配访问某个文件

(location = 目录) > (location ^~ 目录/) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)

rewrite跳转实验

Nginx编译安装

#首先先关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#安装语言支持包

[root@localhost ~]# yum -y install pcre-devel zlib-devel

#挂载解压安装包

[root@localhost ~]# mkdir /abc
[root@localhost ~]# mount.cifs //192.168.17.1/LNMP /abc
Password for root@//192.168.17.1/LNMP:  
[root@localhost ~]# cd /abc
[root@localhost abc]# ls
Discuz_X3.4_SC_UTF8.zip    php-7.1.10.tar.bz2
mysql-boost-5.7.20.tar.gz  php-7.1.20.tar.bz2
ncurses-5.6.tar.gz         php-7.1.20.tar.gz
nginx-1.12.2.tar.gz        zend-loader-php5.6-linux-x86_64_update1.tar.gz
php-5.6.11.tar.bz2
[root@localhost abc]# tar zxvf nginx-1.12.2.tar.gz -C /opt

#添加程序用户

[root@localhost ~]# useradd -M -s /sbin/nologin nginx

#配置编译安装

[root@localhost abc]# cd /opt
[root@localhost opt]# ls
nginx-1.12.2  rh
[root@localhost opt]# cd nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure \
> --prefix=/usr/local/nginx \               //安装路径
> --user=nginx \                           //指定用户
> --group=nginx \                            //指定组
> --with-http_stub_status_module               //开启统计模块

[root@localhost nginx-1.12.2]# make && make install        //编译安装

#建立连接便于管理

[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/                    //nginx命令执行路径优化

#制作service管理脚本

[root@localhost nginx-1.12.2]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"           //变量指向命令文件
PIDF="/usr/local/nginx/logs/nginx.pid"       //变量指向nginx进程号   
case "$1" in
     start)
	$PROG
	;;
    stop)
	kill -s QUIT $(cat $PIDF)             //QUIT信号表示退出进程
	;;
    restart) 
	$0 stop
	$0 start
	;;
    reload)
	kill -s HUP $(cat $PIDF)           //HUP信号表示重载配置
	;;
    *)
	echo "Usage: $0 {start |stoplrestart |reload}"
	exit 1
esac
exit 0

[root@localhost nginx-1.12.2]# chmod +x /etc/init.d/nginx      //添加执行权限
[root@localhost nginx-1.12.2]# chkconfig --add nginx           //添加系统识别命令
[root@localhost nginx-1.12.2]# chkconfig --level 35 nginx on    //设置开机自启

#启动服务

[root@localhost nginx-1.12.2]# service nginx start 
[root@localhost nginx-1.12.2]# netstat -ntap | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      8216/nginx: master

#进入网页进行验证,安装成功

在这里插入图片描述

配置dns服务,方便域名解析
[root@localhost ~]# yum install -y bind

#配置主配置文件

[root@localhost ~]# vim /etc/named.conf 

在这里插入图片描述

#配置区域配置文件

[root@localhost ~]# vim /etc/named.rfc1912.zones 

在这里插入图片描述
#配置区域数据配置文件

[root@localhost ~]# cp -p /var/named/named.localhost /var/named/kgc.com.zone

[root@localhost ~]# vim /var/named/kgc.com.zone 

在这里插入图片描述

#启动服务

root@localhost ~]# systemctl start named
基于域名的跳转

描述:公司旧域名www.kgc.com,因业务需求有变更,需要使用新域名www.ky02.com代替

要求:1、不能废除旧域名

​ 2、从旧域名跳转到新域名,且保持其参数不变

#在nginx主配置文件,location中添加匹配及跳转语句

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

#nginx配置完成后,还需要到dns中添加ky02的区域并添加解析地址

[root@localhost named]# vim /etc/named.rfc1912.zones 

在这里插入图片描述

#因为ky02的解析地址与kgc地址一样,同一个服务器,所以直接复制过来就可以了

[root@localhost named]# cp -p kgc.com.zone ky02.com.zone
[root@localhost named]# ls
data  dynamic  kgc.com.zone  ky02.com.zone  named.ca  named.empty  named.localhost  named.loopback  slaves

#现在我们将服务全部重启并进行访问验证

[root@localhost named]# systemctl restart named
[root@localhost named]# service nginx restart

在这里插入图片描述

注:1.html文件此时并没有创建,不存在,所以访问肯定是找不到页面的

基于客户端IP访问跳转

描述:今天公司业务版本上线,所有IP访问任何内容都显示一个固定的维护页面,只有公司IP正常访问

环境:

服务器:centos7-4 192.168.17.130

公司主机:win 10 192.168.17.154

外部主机:win 7 192.168.17.155

#只需要在nginx主配置文件,server段中条件匹配

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述
#到站点目录中添加维护站点ky02.html

[root@localhost named]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# vim ky02.html
<h1> 页面维护ing </h1>

#重启服务,进行访问验证:

在这里插入图片描述

访问验证后可以看到,使用公司主机可正常访问主页,使用外部主机访问则跳转到定义好的维护页面,实现了根据IP地址做分流

基于旧、新域名跳转并加目录

描述:将域名http://www.kgc.com下面的发帖都跳转到http://www.ky02.com/bbs,且与i给你跳转后保持参数不变

#只需要在nginx主配置文件,server段中添加一个location段,匹配目录

只要匹配到post目录,例如访问www.kgc.com/post 这个目录,将会进行跳转至www.ky02.com/bbs/post

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

#添加完成后重启服务,进行访问验证

在这里插入图片描述
注:a.html文件未创建,所以访问找不到页面

基于参数匹配的跳转

描述:浏览器访问http://www.kgc.com/100-(100|200)-100.html,则跳转到http://www.kgc.com页面

#只需要在nginx主配置文件,server段中添加一个if判断,匹配参数即可

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

注:其中d 代表数字 +代表数字匹配一次或多次。总意为:只要是数字,不限制长度

(例:www.kgc.com/100-100-99999.html)

#配置完成后重启服务,并进行访问验证

在这里插入图片描述

基于目录下所有php文件跳转

描述:访问http://www.kgc.com/upload/c.php跳转到首页

#只需要在nginx主配置文件,server段中添加一个loaction段,匹配条件跳转即可

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述
#重启服务,进行访问验证

在这里插入图片描述

基于最普通url请求的跳转

描述:访问一个具体页面跳转到首页

#只需要在nginx主配置文件,server段中添加一个loaction段,匹配条件跳转即可

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

#重启服务,进行访问验证

在这里插入图片描述

发布了72 篇原创文章 · 获赞 44 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ML908/article/details/103729735