CentOS 7.6 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;
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/107942084