千家信息网

Nginx正则表达式与Nginx rewrite重写功能的介绍

发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,这篇文章将为大家详细讲解有关Nginx正则表达式与Nginx rewrite重写功能的介绍,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 Rewrite 跳转实
千家信息网最后更新 2025年02月24日Nginx正则表达式与Nginx rewrite重写功能的介绍

这篇文章将为大家详细讲解有关Nginx正则表达式与Nginx rewrite重写功能的介绍,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、 Rewrite 跳转实现
服务协议功能模块
url 资源定位路径

  • nginx----支持url重写、支持if条件判断,但不支持else
  • 跳转----循环最多可以执行10次,超过后nginx将返回500代码错误
  • rewrite----使用nginx'全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

    二、Rewrite 使用场景
  • 使用rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用location匹配再跳转
    1.rewrite放在 server{},if{},location{}段中
    2.对域名或参数字符串:使用if全局变量匹配、使用proxy_pass反向代理
    三、nginx正则表达式
    常用的正则表达式元字符

    四、Rewrite 命令

    location分类

    正则匹配的常用表达式

    五、location优先级
    按优先级排列:
  • = 类型
  • ^~ 类型表达式
  • 正则表达式(和)类型
  • 常规字符串匹配类型,按前缀匹配
  • 通用匹配(/),如果没有其他匹配,任何请求都会匹配到
    location优先级规则(从高到低排列)
    1.匹配某个具体的文件
  • location = 完整路径
  • location ^~ 完整路径
  • location ~* 完整路径
  • location ~ 完整路径
  • location 完整路径
  • location /
    2.用目录做匹配访问某个文件
  • location = 目录
  • location ^~ 目录
  • location ~ 目录
  • location ~* 目录
  • location 目录
  • location /
    六、应用场景测试
    公司旧域名 www.domain.com 因业务需求有变更,需要使用新域名 www.newdomain.com 代替,不能废除旧域名,从旧域名跳转到新域名,且保持其参数不变

    [root@localhost bin]# 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.IHyTHc: 头V4 RSA/SHA1 Signature, 密钥 ID 7bd9bf62: NOKEY准备中...                          ################################# [100%]正在升级/安装...1:nginx-release-centos-7-0.el7.ngx ################################# [100%][root@localhost bin]# yum install nginx -y 
    [root@localhost ~]# mkdir /abc[root@localhost ~]# mount.cifs //192.168.56.1 /mntPassword for root@//192.168.254.10/linuxs:  [root@localhost ~]# cd /abc/LNMP-C7/LNMP-C7/[root@localhost LNMP-C7]# lsDiscuz_X3.4_SC_UTF8.zipmysql-boost-5.7.20.tar.gzncurses-5.6.tar.gznginx-1.12.2.tar.gzphp-5.6.11.tar.bz2php-7.1.10.tar.bz2php-7.1.20.tar.bz2php-7.1.20.tar.gzzend-loader-php5.6-linux-x86_64_update1.tar.gz[root@localhost LNMP-C7]# tar -zxvf nginx-1.12.2.tar.gz -C /opt
    [root@localhost LNMP-C7]# useradd -M -s /sbin/nologin nginx[root@localhost LNMP-C7]# cd /opt/nginx-1.12.2/[root@localhost nginx-1.12.2]# lsauto     CHANGES.ru  configure  html     man     srcCHANGES  conf        contrib    LICENSE  README[root@localhost nginx-1.12.2]# yum install gcc gcc-c++ pcre pcre-devel make zlib-devel -y[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 conf]# vim nginx.conf37         server_name  www.accp.com;41         access_log  logs/www.accp.com/access.log  main;
    [root@localhost conf]# yum install bind -y[root@localhost conf]# vim /etc/named.conf 13         listen-on port 53 { any; };21         allow-query     { any; };[root@localhost conf]# vim /etc/named.rfc1912.zones 25 zone "accp.com" IN {26         type master;27         file "accp.com.zone";28         allow-update { none; };29 };[root@localhost conf]# cd /var/named/[root@localhost named]# lsdata     named.ca     named.localhost  slavesdynamic  named.empty  named.loopback[root@localhost named]# cp -p named.localhost accp.com.zone[root@localhost named]# vim accp.com.zone www     IN      A       192.168.247.202[root@localhost named]# systemctl start named[root@localhost named]# systemctl stop firewalld.service [root@localhost named]# setenforce 0[root@localhost named]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/[root@localhost named]# cd /usr/local/nginx/[root@localhost nginx]# lsconf  html  logs  sbin[root@localhost nginx]# cd logs/[root@localhost logs]# mkdir www.accp.com[root@localhost logs]# lserror.log  www.accp.com[root@localhost logs]# nginx [root@localhost logs]# netstat -natp | grep 80tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6

    打开win10客户机,配置dns服务器,并使用域名访问。

    [root@localhost logs]# vim /usr/local/nginx/conf/nginx.conf    location / {       #域名重定向'                 if ($host = 'www.accp.com') {'                       rewrite ^/(.*)$ http://www.kgc.com/$1 permanent;'               }             root /html;             index index.html index.htm;    }
    [root@localhost logs]# vim /etc/named.rfc1912.zones zone "kgc.com" IN {    type master;    file "kgc.com.zone";    allow-update { none; };};[root@localhost logs]# cd /var/named/[root@localhost named]# lsaccp.com.zone  dynamic   named.empty      named.loopbackdata           named.ca  named.localhost  slaves[root@localhost named]# cp -p accp.com.zone kgc.com.zone
    [root@localhost named]# systemctl restart named[root@localhost named]# killall -1 nginx

    [root@localhost html]# vim /usr/local/nginx/conf/nginx.conf37         server_name  bbs.accp.com;42         location /post {43                 rewrite (.+) http://www.accp.com/bbs$1 permanent;44         }
    [root@localhost html]# cd -/var/named[root@localhost named]# vim accp.com.zone [root@localhost named]# cat accp.com.zone $TTL 1D@   IN SOA  @ rname.invalid. (                0   ; serial                1D  ; refresh                1H  ; retry                1W  ; expire                3H )    ; minimumNS  @A   127.0.0.1bbs IN  A   192.168.247.202
    [root@localhost named]# killall -3 nginx[root@localhost named]# nginx[root@localhost named]# systemctl restart named


    基于客户端IP访问跳转

    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf42 #设置是否合法的IP标志43         set $rewrite true;44 #判断是否为合法IP,是否是允许的IP45         if ($remote_addr = "192.168.247.139"){46                 set $rewrite false;47         }48 #不被允许的IP进行判断,打上标记49         if ($rewrite = true){50                 rewrite (.+) /maintenance.html;51         }52 #匹配标记进行跳转站点53         location = /maintenance.html {54                 root html;55         }
    [root@localhost named]# cd /usr/local/nginx/html/[root@localhost html]# ls50x.html  index.html[root@localhost html]# vim maintenance.html[root@localhost html]# killall -3 nginx [root@localhost html]# nginx 



    基于参数匹配的跳转---跳转到首页

    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf37         server_name  www.accp.com;42         if ($request_uri ~ ^/100-(100|200)-(\d+).html$){43                 rewrite (.*) http://www.accp.com permanent;44         }[root@localhost named]# vim accp.com.zone [root@localhost named]# cat accp.com.zone $TTL 1D@   IN SOA  @ rname.invalid. (                0   ; serial                1D  ; refresh                1H  ; retry                1W  ; expire                3H )    ; minimumNS  @A   127.0.0.1www IN  A   192.168.247.202
    [root@localhost named]# systemctl restart named[root@localhost named]# killall -3 nginx[root@localhost named]# nginx



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

    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf42         location ~* /upload/.*\.php$ {43                 rewrite (.+) http://www.accp.com permanent;44         }
    [root@localhost named]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@localhost named]# killall -3 nginx[root@localhost named]# nginx



    基于最普通URL请求的跳转--跳转到首页

    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf42         location ~* ^/abc/123.html {43                 rewrite (.+) http://www.accp.com permanent;44         }



    基于最普通URL请求的跳转--跳转到首页

    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf42         location ~* ^/abc/123.html {43                 rewrite (.+) http://www.accp.com permanent;44         }
    [root@localhost named]# killall -3 nginx[root@localhost named]# nginx
到此为止, 关于Nginx正则表达式与Nginx rewrite重写功能有了一个基础的认识, 但是对于具体的使用方法还是需要多加巩固和练习,如果想了解更多相关内容,请关注行业资讯。
0