理論+實操:nginx rewrite 重寫功能和nginx的正則表達式

前言

  • rewrite
  • Nginx的正則表達式

一:Rewrite 跳轉場景

  • URL看起來更規範、合理
  • 企業會將動態url地址僞裝成靜態地址提供服務
  • 網址換新域名後,讓舊的訪問跳轉到新的域名上
  • 服務端某些業務調整

二: Rewrite 跳轉實現

服務__ 協議 __功能模塊

url 資源定位路徑

  • nginx————支持url重寫、支持if條件判斷,但不支持else
  • 跳轉————循環最多可以執行10次,超過後nginx將返回500代碼錯誤
  • rewrite————使用nginx’全局變量或自己設置的變量,結合正則表達式和標誌位實現url重寫以及重定向

在這裏插入圖片描述

三: Rewrite 使用場景

3.1 nginx跳轉需求的實現方式

  • 使用rewrite進行匹配跳轉
  • 使用if匹配全局變量後跳轉
  • 使用location匹配再跳轉

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

3.3 對域名或參數字符串

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

四: nginx正則表達式

4.1 常用的正則表達式元字符

在這裏插入圖片描述

五:Rewrite 命令

5.1 語法

在這裏插入圖片描述

5.2 flag標記說明

在這裏插入圖片描述

5.3 last 和 break 比較

在這裏插入圖片描述

小結:

  • 簡述Rewrite跳轉實現
  • 什麼是正則表達式?列舉至少三個常用的flag
  • 比較Rewrite命令flag參數值:last和break,說出二者的一同

正則表達式:

處理字符串的工具,一某種規則去處理,正砸表達式就是定義其中的規則

六:location分類

6.1 分類

在這裏插入圖片描述

6.2 正則匹配的常用表達式

在這裏插入圖片描述

七:location優先級

7.1 相同類型的表達式,字符串長的會優先匹配

7.2 按優先級排列

  • = 類型
  • ^~ 類型表達式
  • 正則表達式(*)類型
  • 常規字符串匹配類型,按前綴匹配
  • 通用匹配(/),如果沒有其他匹配,任何請求都會匹配到

八: 比較rewrite 和location

8.1 相同點

  • 都能實現跳轉

8.2 不同點

  • rewrite是在同一域名內更改獲取資源的路徑
  • location是對一類路徑做控制訪問或反向代理,還可以proxy_pass到其他機器

8.3 rewrite會寫在location裏,執行順序

  • 執行server塊裏面的rewrite指令
  • 執行location匹配
  • 執行選定的location中的rewrite指令

九 : Location優先級的示例

在這裏插入圖片描述

在這裏插入圖片描述

十 : location優先級規則(從高到低排列)

10.1 匹配某個具體的文件

  • location = 完整路徑
  • location ^~ 完整路徑
  • location ~* 完整路徑
  • location ~ 完整路徑
  • location 完整路徑
  • location /

10.2 用目錄做匹配訪問某個文件

  • location = 目錄
  • location ^~ 目錄
  • location ~ 目錄
  • location ~* 目錄
  • location 目錄
  • location /

十一:應用場景測試

11.1 基於域名的跳轉

  • 公司舊域名www.domain.com,因業務需求有變更,需要使用新域名www.newdomain.com代替
    • 不能廢除舊域名
    • 從舊域名跳轉到新域名,且保持其參數不變

在這裏插入圖片描述

  • 瀏覽器測試輸入某個具體的URL——http://www.domain.com/test/1/index.php
  • 跳轉到http://www.newdomain.com/test/1/index.php
  • 從headers裏面可以看到301實現了永久重定向跳轉,且域名後的參數也正常跳轉
[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.254.10/linuxs /abc
Password for root@//192.168.254.10/linuxs:  
[root@localhost ~]# cd /abc/LNMP-C7/LNMP-C7/
[root@localhost LNMP-C7]# ls
Discuz_X3.4_SC_UTF8.zip
mysql-boost-5.7.20.tar.gz
ncurses-5.6.tar.gz
nginx-1.12.2.tar.gz
php-5.6.11.tar.bz2
php-7.1.10.tar.bz2
php-7.1.20.tar.bz2
php-7.1.20.tar.gz
zend-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]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  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.conf
 37         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]# ls
data     named.ca     named.localhost  slaves
dynamic  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]# ls
conf  html  logs  sbin
[root@localhost nginx]# cd logs/
[root@localhost logs]# mkdir www.accp.com
[root@localhost logs]# ls
error.log  www.accp.com
[root@localhost logs]# nginx 
[root@localhost logs]# netstat -natp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6087/nginx: master  

打開客戶機,配置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]# ls
accp.com.zone  dynamic   named.empty      named.loopback
data           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.conf
 37         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 )	; minimum
	NS	@
	A	127.0.0.1
bbs	IN	A	192.168.247.202
[root@localhost named]# killall -3 nginx
[root@localhost named]# nginx

[root@localhost named]# systemctl restart named

在這裏插入圖片描述

在這裏插入圖片描述

11.2 基於客戶端IP訪問跳轉

  • 今天公司業務版本上線,所有IP訪問任何內容都顯示一個固定維護頁面,只有公司IP訪問正常

在這裏插入圖片描述

布爾類型的數據可以直接進行if判斷,判斷訪問者是否合法

如果不合法,在原有地址的基礎上追加一條/maintenance.html頁面

對追加的頁面內寫入想要輸出的內容

在這裏插入圖片描述

[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf

 42 #設置是否合法的IP標誌
 43         set $rewrite true;
 44 #判斷是否爲合法IP,是否是允許的IP
 45         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]# ls
50x.html  index.html
[root@localhost html]# vim maintenance.html
[root@localhost html]# killall -3 nginx 
[root@localhost html]# nginx 

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

11.3 基於參數匹配的跳轉——————跳轉到首頁

在這裏插入圖片描述

[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
 37         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 )	; minimum
	NS	@
	A	127.0.0.1
www	IN	A	192.168.247.202
[root@localhost named]# systemctl restart named
[root@localhost named]# killall -3 nginx
[root@localhost named]# nginx

在這裏插入圖片描述

在這裏插入圖片描述

11.4 基於目錄下所有PHP文件跳轉

  • 訪問PHP文件都會跳轉到首頁
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
 42         location ~* /upload/.*\.php$ {
 43                 rewrite (.+) http://www.accp.com permanent;
 44         }
[root@localhost named]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost named]# killall -3 nginx
[root@localhost named]# nginx

在這裏插入圖片描述

在這裏插入圖片描述

11.5 基於最普通URL請求的跳轉————跳轉到首頁

在這裏插入圖片描述

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

在這裏插入圖片描述

在這裏插入圖片描述

11.5 基於最普通URL請求的跳轉————跳轉到首頁

[外鏈圖片轉存中…(img-82cagtIv-1577351501751)]

[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
 42         location ~* ^/abc/123.html {
 43                 rewrite (.+) http://www.accp.com permanent;
 44         }
[root@localhost named]# killall -3 nginx
[root@localhost named]# nginx
發佈了116 篇原創文章 · 獲贊 27 · 訪問量 9476
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章