Nginx的rewrite功能
一、实验环境
服务器:192.168.245.120(CentOS 7.6)
客户机:192.168.245.10(win10)/192.168.245.140 (CentOS 7.6)
二、实验准备
linux服务器:yum安装nginx
[root@server ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
获取http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
警告:/var/tmp/rpm-tmp.keAgjj: 头V4 RSA/SHA1 Signature, 密钥 ID 7bd9bf62: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:nginx-release-centos-7-0.el7.ngx ################################# [100%]
[root@server ~]#
[root@server ~]# yum install nginx -y
三、rewrite配置实例
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用
rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
1、执行server块的rewrite指令
2、执行location匹配
3、执行选定的location中的rewrite指令
语法:rewrite regex replacement [flag];
正则表达式:
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。
flag标志位:
last : 相当于Apache的[L]标记,表示完成rewrite
break : 停止执行当前虚拟主机的后续rewrite指令集
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
location表达式类型:
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
= 进行普通字符精确匹配。也就是完全匹配。
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location优先级说明
在nginx的location和配置中location的顺序没有太大关系。跟location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
=:优先级最高。表示精确匹配,一旦匹配成功,则不再查找其他匹配项。
^~:以字符开头的模糊匹配,一旦匹配成功,则不再查找其他匹配项。
正则表达式类型(~/~*/!~/!~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
后面跟路径:常规字符串匹配类型。按前缀匹配。
/:通用匹配,如果没有其他匹配,任何请求都会匹配到它
注意:越是能更多的进行匹配的优先级最高
1、自动跳转新域名
第一步:安装好nginx,修改配置文件,设置域名,然后启动nginx,客户端测试网页能够正常访问
[root@server ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name www.yjs.com;
[root@server ~]# systemctl start nginx
第二步:修改配置文件,location / 加入以下if语句,如果访问了www.yjs.com这个域名,就永久跳转到http://www.yjsnew.com/这个URL
[root@server ~]# vim /etc/nginx/conf.d/default.conf
location / {
if ($host = "www.yjs.com"){
rewrite ^/(.*)$ http://www.yjsnew.com/$1 permanent;
}
}
$host <----定义了URL里面的主机部分的内容
^/(.*)$ 解读:
^:以……开头
.*表示任意所有
()表示把括号里的内容当做一个整体,后面需要调用,第一个()里的用$1调用,第二个()用$2调用,以此类推
这里的$1并不是shell里的位置变量,注意区分!
$表示以……结尾
下面是可以用作if判断的全局变量
$args : #这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$document_root : 当前请求在root指令中指定的值。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$limit_rate : 这个变量可以限制连接速率。
$request_method : 客户端请求的动作,通常为GET或POST。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。
第三步:重启服务
[root@server ~]# systemctl restart nginx
第四步:客户机上验证访问
2、不同ip的分离访问
场景:假设公司的web服务器正在维护,而公司内部用户访问服务器ip可以正常访问,而对于外部用户访问服务器ip就跳转到维护页面
charset utf8;
#access_log /var/log/nginx/host.access.log main;
set $rewrite false;
if ($remote_addr = "192.168.245.10"){
set $rewrite true;
}
if ($rewrite = false){
rewrite (.+) /main.html;
}
location = /main.html {
root /usr/share/nginx/html;
}
[root@server ~]# cd /usr/share/nginx/html
[root@server html]# ls
50x.html index.html
[root@server html]# vim main.html
<h1>网站正在维护中!</h1> <----为跳转页面写一个网页内容
192.168.245.10客户机在访问的时候是正常的网页内容,而不是这个地址访问的就是维护中的网页
3、改变域名加目录跳转
修改配置文件,当访问bbs.yjs.com/post时跳转到www.yjs.com/bbs/post
server {
listen 80;
server_name bbs.yjs.com;
charset utf8;
location /post {
rewrite (.+) http://www.yjs.com/bbs$1 permanent;
}
记得把域名的主机头换成bbs,否则不能解析
[root@server html]# vim /var/named/yjs.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
bbs IN A 192.168.245.120
4、序列号或者数字型跳转
当客户端请求的uri是以100开头的,第一个“-面是100或者200的,第三个-后面是任何数字并且以html结尾的话,就跳转到www.yjs.com
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
rewrite (.*) http://www.yjs.com permanent;
}
5、其他网页类型的跳转
当访问有/upload/的并且以php结尾,中间任意多个字符的页面时跳转到www.yjs.com
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.yjs.com permanent;
}
6、详情页跳转到主页
当访问的uri是以/abc/123.html开头的也不区分大小写这样的网页的时候跳转到www.yjs.com
location ~* ^/abc/123.html {
rewrite (.+) http://www.yjs.com permanent;
}