Nginx Rewrite實際應用配置解析

weixin_50345481發表於2020-12-02


前言

在各種網站伺服器軟體中,除了Apache HTTP Server外,還有一款輕量級的HTTP伺服器軟體——Nginx,本文就Nginx中的Rewrite的應用場景相關配置進行一些解析,學習。


一 Nginx Rewrite概述

1.1 Rewrite跳轉場景

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

1.2 Rewrite跳轉實現圖例

在這裡插入圖片描述

1.3 Rewrite實際場景

1.Nginx跳轉需求的實現方式

使用rewrite進行匹配跳轉
使用if匹配全域性變數後跳轉
使用location匹配再跳轉

2.rewirte放在server{},if{},location{}段中

location只對域名後邊的除去傳遞引數外的字串起作用

3.對域名或引數字串

使用if全域性變數匹配   (重定向)
使用proxy_pass反向代理  (動靜分離)

1.4 Nginx正規表示式

常用的正規表示式元字元

  字元                         說明
   ^                   匹配輸入字串的起始位置
   $                   匹配輸入字串的結束位置
   *                   匹配前面的字元零次或多次
   +                   匹配前面的字元一次或多次
   ?                  匹配前面的字元零次或一次
   .                   匹配除“\n”(換行)之外的任何單個字元
   \      轉義字元      將後面接著的字元標記為一個特殊字元或一個原義字元或一個向後引用(使用諸如“[.\n]”之類的模式,可匹配包括“\n”在內的任意字元)
  \d                   匹配純數字  [0-9] 代替單個數字
  {n}                  重複n次
 {n,}                  重複n次或更多次
  [c]                  匹配單個字元c
 [a-z]                 匹配a-z小寫字母的任意一個
[a-zA-Z]               匹配a-z小寫字母或A-Z大寫字母的任意一個

1.5 Rewrite命令

1.5.1 Rewrite命令語法

rewrite      <regex>       <replacement>       [flag]
           需要匹配的正則    跳轉後的內容   rewrite支援的flag標記

1.5.2 flag標記說明

 標記                               說明
last       迴圈匹配    相當於Apache的[L]標記,表示完成rewrite
break               本條規則匹配完成即終止,不再匹配後面的任何規則
redirect            返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址,爬蟲不會更新url
permanent           返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址,爬蟲更新url (路徑會改變)

1.5.3 last和break比較

都可以實現跳轉

                     last                       break
使用場景         一般寫在server和if中      一般使用在location中
URL匹配          不終止重寫後的url匹配       終止重寫後的url匹配

1.6 location分類

1.6.1 分類

location = patt {} [精確匹配]
location patt {} [一般匹配]
location ~ patt {} [正則匹配]

1.6.2 正則匹配的常用表示式

標記                         說明
~                     執行一個正則匹配,區分大小寫
~*                    執行一個正則匹配,不區分大小寫 
!~                    執行一個正則匹配,區分大小寫不匹配
!~*                   執行一個正則匹配,不區分大小寫不匹配
^~                    普通字元匹配,使用字首匹配。如果匹配成功,則不再匹配其它location
=                     普通字元精確匹配。也就是完全匹配 
@                     定義一個命名的location,使用在內部定向時

1.7 loation優先順序

1.相同型別的表示式,字串長的會優先匹配

2.按優先順序排列

= 型別                                       精確匹配
^~ 型別表示式                                 字首匹配
正規表示式 (~和~*)型別  
常規字串匹配型別,按字首匹配                   一般匹配
通用匹配(/),如果沒有其他匹配,任何請求都會匹配到  通用匹配

1.8 location優先順序規則

(location = 完整路徑)精確 > (location ^~ 完整路徑) 字首> (location ~* 完整路徑 )正則 = (location ~ 完整路徑) 正則> (location  完整路徑)一般 > (location /)通用

1.9 用目錄做匹配訪問某個檔案

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

1.10 比較rewrite和location

1.相同點 :

都可以實現跳轉

2.不同點:

rewrite是在同一域名內更改獲取資源的路徑
location是對一類路徑做控制訪問或反向代理,還可以proxy_pass到其它機器
rewrite會寫在location裡,執行順序
執行server塊裡面的rewrite指令
執行location匹配
執行選定的location中的rewrite指令

二 Nginx Rewrite應用配置

2.1 安裝Nginx服務

1.步驟

1.安裝nginx源
2.安裝nginx軟體包
3.修改預設站點配置檔案:etc/nginx/conf.d/default.conf
4.啟動nginx

注意:

確定域名可以正常解析
做下一個場景前,要刪除上一個場景的配置
及時清除瀏覽器快取

2.2 基於域名的跳轉

2.2.1 配置需求

公司舊域名www.kgc.com,因業務需求有變更,需要使用新域名www.newkgc.com代替

不能廢除舊域名
從舊域名跳轉到新域名,且保持其引數不變

  1. 先進行域名對映配置
    在C盤/Windows/system32/drivers/etc/hosts檔案
    文字形式開啟檔案
    新增
    20.0.0.12 www.domain.com www.newdomain.com

    另存到桌面,儲存型別 “所有檔案”
    刪除原檔案,刪除檔案字尾 .txt
    複製到etc資料夾中。

2.檢視服務程式

[root@client1 ~]# curl -I http://localhost
預設200

在這裡插入圖片描述
3.編輯配置檔案

[root@client1 ~]# vi /etc/nginx.conf 
新增修改
 server_name  www.domain.com;
        if ($host = 'www.domain.com')
    {
        rewrite ^/(.*)$ http://www.newdomain.com/$1 permanent;
    }

在這裡插入圖片描述

$host :全域性變數 
server {
        listen       80;
        server_name  www.domain.com;
        if ($host = 'www.domain.com')
    {
        rewrite ^/(.*)$ http://www.newdomain.com/$1 permanent;
    }

        charset utf-8;

        access_log  logs/www.domain.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ /status {
            stub_status on;
            access_log off;
        }

在這裡插入圖片描述

[root@client1 ~]# vi /etc/nginx.conf 
[root@client1 ~]# nginx -t            檢查語法,報錯,沒有目錄不存在
[root@client1 ~]# mkdir /var/log/nginx   建立目錄
[root@client1 ~]# nginx -t

在這裡插入圖片描述

[root@client1 ~]# ulimit -n 65535 >> /etc/rc.local 
[root@client1 ~]# nginx -t
[root@client1 ~]# mkdir -p /usr/share/nginx/html      建立主頁   -p:巢狀
[root@client1 ~]# echo "this is a apple." > /usr/share/nginx/html/index.html
[root@client1 ~]# cat /usr/share/nginx/html/index.html   檢視主頁
[root@client1 ~]# systemctl stop nginx
[root@client1 ~]# systemctl start nginx

在這裡插入圖片描述
在瀏覽器上http;//www.domain.com

在這裡插入圖片描述
進行抓包
在這裡插入圖片描述
重定向後程式碼301
在瀏覽器上http;//www.domain.com/a
在這裡插入圖片描述

進行抓包
在這裡插入圖片描述

2.3 基於客戶端IP訪問跳轉

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

2.3.2 方法一

檢視ip地址

[root@client1 ~]# ifconfig 

在這裡插入圖片描述

域名捆綁

[root@client1 ~]# vi /etc/hosts

20.0.0.12   www.domain.com

在這裡插入圖片描述
修改預設站點配置檔案,
先刪除之前的域名跳轉的配置檔案

[root@client1 ~]# vi /etc/nginx.conf 
刪除

在這裡插入圖片描述

在這裡插入圖片描述

[root@client1 ~]# vi /etc/nginx.conf 
[root@client1 ~]# nginx -t
[root@client1 ~]# systemctl stop nginx
[root@client1 ~]# systemctl start nginx

新增
 set $rewrite true;    變數自定義
        if ($remote_addr = "20.0.0.12") {   全域性變數 (重定向)
        set $rewrite false;
    }
        if ($rewrite = true) {
        rewrite (.+) /maintenance.html;    整個域名
    }
        location = /maintenance.html {     精確定位
        root   /usr/share/nginx/html;        根路徑
    }

在這裡插入圖片描述

在這裡插入圖片描述

建立重定向網頁

[root@client1 ~]# vi /usr/share/nginx/html/maintenance.html

Website is Maintaining,Please visit later.

在這裡插入圖片描述
在主機20.0.0.12的瀏覽器上
http://www.domain.com
在這裡插入圖片描述
在這裡插入圖片描述

在其他裝置瀏覽器上
http://www.domain.com
在這裡插入圖片描述

2.3.3 方法二

修改伺服器地址進行訪問跳轉

[root@client1 ~]# ifconfig ens33 20.0.0.22  
[root@client1 ~]# ifconfig

在這裡插入圖片描述

修改域名對映

[root@client1 ~]# vi /etc/hosts

20.0.0.22   www.domain.com

在這裡插入圖片描述

在本地瀏覽器上再次訪問http://www.domain.com
在這裡插入圖片描述

說明 $remote_addr 針對的地址ip上客戶機訪問地址

2.4 基於舊,新域名跳轉並加目錄

2.4.1配置需求

將域名http;//bbs.kgc.com下面的發帖都跳轉到http://www.kgc.com/bbs.且域名跳轉後保持引數不變。

[root@client1 ~]# vi /etc/nginx.conf 
[root@client1 ~]# nginx -t

刪除
在這裡插入圖片描述
新增

location /post {
            rewrite (.+) http://www.domain.com/bbs$1 permanent;
        }

在這裡插入圖片描述
修改

 server {
             listen 80;
             server_name www.domain.com;
             charset utf-8;
             access_log /var/log/nginx/www.domain.com-access.log main;
       location / {
             root html;
             index index.html index.htm;
    }
}

在這裡插入圖片描述
新增bbs目錄,建立網頁

[root@client1 ~]# cd /usr/local/nginx/html/
[root@client1 html]# ls -lh
[root@client1 html]# mkdir -p bbs/post
[root@client1 html]# ls -R bbs/
[root@client1 html]# cd bbs/post/
[root@client1 post]# ls -lh
[root@client1 post]# vi a.html
[root@client1 post]# cd
[root@client1 ~]# systemctl stop nginx
[root@client1 ~]# systemctl start nginx

在這裡插入圖片描述

域名對映

[root@client1 ~]# vi /etc/hosts

20.0.0.12   www.domain.com bbs.domain.com

在這裡插入圖片描述

在瀏覽器上
bbs.domain.com/post/a.html
在這裡插入圖片描述

2.5 基於引數匹配的跳轉

[root@client1 ~]# vi /etc/nginx.conf 
[root@client1 ~]# nginx -t
[root@client1 ~]# systemctl stop nginx
[root@client1 ~]# systemctl start nginx

修改刪除

在這裡插入圖片描述

在這裡插入圖片描述
新增 正規表示式

 if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {100開頭-100或者200-數字
        rewrite (.*) http://www.domain.com permanent;
        }       

在這裡插入圖片描述

在瀏覽器上
www.domain.com

在這裡插入圖片描述
在瀏覽器上
www.domain.com/100-100-100.html
在這裡插入圖片描述
在瀏覽器上
www.domain.com/100-400-100.html
在這裡插入圖片描述

2.6 基於目錄下所有php檔案跳轉

[root@client1 ~]# vi /etc/nginx.conf 
[root@client1 ~]# nginx -t
[root@client1 ~]# systemctl stop nginx
[root@client1 ~]# systemctl start nginx

刪除
在這裡插入圖片描述
新增

  location ~* /upload/.*\.php$ {
             rewrite (.+) http://www.domain.com permanent;
        }
~*:不區分大小寫

在這裡插入圖片描述

在這裡插入圖片描述

在瀏覽器上
www.domain.com/upload/1.php
在這裡插入圖片描述

http://www.domain.com/UPLOAD/1.php
在這裡插入圖片描述
http://www.domain.com/test/1.php
在這裡插入圖片描述

2.7 基於最普通url請求的跳轉

 [root@client1 ~# vi /etc/nginx.conf 
 
修改
  location ~* ^/1/test.html {   可不區分大小寫
             rewrite (.+) http://www.domain.com permanent;
        }

在這裡插入圖片描述

在瀏覽器上
http://www.domain.com/1/test/html

在這裡插入圖片描述

http://www.domain.com/1/TEST.html

在這裡插入圖片描述


總結

通過以上對Nginx Rewrite實際操作的配置解析,加深了對該服務命令的認知。

相關文章