中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nginx Rewrite的實現原理和使用方法

發布時間:2020-06-16 15:06:11 來源:億速云 閱讀:397 作者:元一 欄目:系統運維

一、理論講解

1.1Nginx Rewrite簡介

Nginx Rwrite即Nginx服務的規則重寫,主要的功能是實現瀏覽器訪問HTTP URL的跳轉,其中相關的正則表達式是基于Perl語言。一般來說,幾乎所有的Web服務器都支持URL重寫。

Rewrite是一種服務器的重寫 技術,它可以使得服務器可以支持 URL 重寫,是一種最新流行的服務器技術。它還可以實現限制特定IP訪問網站的功能。很多情況下,某個 IP 的訪問很容易造成 CPU 100% (比如 某些搜索引擎的固定抓取,別人大量的采集站點),這個時候我們就要利用一些有效的手段封掉對方的 IP,讓他無法消耗服務器的資源,封 IP 的方法有很多種,如果你的 Web 服務器安裝了 Rewrite 模塊的話,也可以試試利用 Rewrite 規則封掉對方的 IP。

1.1.1什么是URL?

對于百度給出的定義如下:URL(Uniform Resource Locator),統一資源定位符。這樣的表述似乎過于抽象,因為可能根本不了解什么是“統一資源定位符”?其實我們可以將URL簡易地理解為你所需要通過網絡獲取資源的地址,(URL)是由一串字符組成,這些字符可以是字母,數字和特殊符號。

具體實例如下:

php+HTML
http://www.wangluopx.cn/yunwei/gz/zz/2018-07-03/1940.html

其具體結構在這就不做詳細闡述了,有興趣可以自行查閱相關文檔。

1.1.2“跳轉”有什么用?

跳轉需要根據具體的應用場景才能真正體會到nginx規則重寫實現網頁跳轉的作用。稍后會根據不同的應用場景進行對應的操作與設置。一般來說,實現跳轉的作用可以總結為以下幾個方面:

  1. 調整用戶瀏覽的URL,使其規范;
  2. 使搜索引擎收錄網站內容,提升用戶的使用體驗;
  3. 隱藏網站URL真實地址等;

1.1.3Perl是什么語言?

Perl,一種功能豐富的計算機程序語言,運行在超過100種計算機平臺上,適用廣泛,從大型機到便攜設備,從快速原型創建到大規模可擴展開發。

Perl借取了C、sed、awk、shell腳本語言以及很多其他程序語言的特性,其中最重要的特性是它內部集成了正則表達式的功能,以及巨大的第三方代碼庫CPAN。簡而言之,Perl像C一樣強大,像awk、sed等腳本描述語言一樣方便,被Perl語言愛好者稱之為“一種擁有各種語言功能的夢幻腳本語言”、“Unix中的王牌工具”。

1.2如何實現Rewrite跳轉?

rewrite使用Nginx全局變量或自己設置的變量,結合正則表達式和標志位實現URL重寫以及重定向
,基于ngx_http_rewrite_module模塊進行處理。

1.2.1Rwrite 實用場景

Nginx跳轉需求的實現方式

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

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

對域名或參數字符串

●使用if全局變量匹配
  ●使用proxy_ pass反向代理

1.2.2命令語法

rewrite <regex> <replacement> [flag];
正則  跳轉后的內容  rewrite支持的flag

1.2.3location分類

location = patt{}[精準匹配]
location patt{} [一般匹配]
location ~patt{} [正則匹配]
正則匹配的常用表達式

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

1.2.4location優先級

1.相同類型的表達式,字符串長的會優先匹配
2.按優先級排列
●=類型
●^~類型表達式
●正則表達式(~和~*)類型
●常規字符串匹配類型,按前綴匹配
●通用匹配(/) ,如果沒有其它匹配,任何請求都會匹配到

1.2.5比較rewrite和location

1.相同點
●都能實現跳轉
2.不同點
●rewrite是在同一域名內更改獲取資源的路徑
●location是對一類路徑做控制訪問或反向代理,還可以proxy_ pass
到其他機器
3.rewrite會寫在location里,執行順序:
●執行server塊里面的rewrite指令
●執行location匹配
●執行選定的location中的rewrite指令

1.2.6location優先級規則

匹配某個具體文件
●(location =完整路徑) > (location ^~完整路徑) > (location ~完整
路徑) > (location ~完整路徑) > (location 完整路徑) > (location /)
用目錄做匹配訪問某個文件
●(location=目錄) > (location ^~目錄/) > (location~目錄) >
(location ~
目錄) > (location 目錄) > (location /)

二、根據不同應用場景下實現Nginx Rewrite的配置實例

首先我們先安裝好域名解析named服務包——bind以及nginx服務(也可以使用手工編譯,這里我們使用yum直接安裝)

1.安裝bind設置配置文件(三個)并開啟服務

[root@localhost ~]# yum install bind -y
[root@localhost named]# netstat -napt | grep named
tcp        0      0 192.168.68.145:53       0.0.0.0:*               LISTEN      6077/named          
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      6077/named          
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      6077/named          
tcp6       0      0 ::1:53                  :::*                    LISTEN      6077/named          
tcp6       0      0 ::1:953                 :::*                    LISTEN      6077/named

2.安裝nginx

我們會看到直接使用yum安裝無法成功的

[root@localhost ~]# yum install -y nginx
已加載插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.cn99.com
沒有可用軟件包 nginx。
錯誤:無須任何處理
[root@localhost ~]# 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.aXVptL: 頭V4 RSA/SHA1 Signature, 密鑰 ID 7bd9bf62: NOKEY
準備中...                          ################################# [100%]
正在升級/安裝...
   1:nginx-release-centos-7-0.el7.ngx ################################# [100%]
[root@localhost ~]# yum install -y nginx
...省略部分內容

3.檢查安裝是否成功,查看配置文件目錄

[root@localhost ~]# rpm -q nginx
nginx-1.16.1-1.el7.ngx.x86_64
[root@localhost ~]# rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/conf.d/default.conf   #這是我們待會做rewrite需要配置更改的文件
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug

2.1 rewrite規則配置應用場景一:基于域名的跳轉

簡單解釋一下該場景:某公司出于某些原因需要將舊的域名修改為新的域名,但是新的域名大家都比較陌生,所以就需要進行舊——新的跳轉,即:客戶機上訪問該舊的域名時可以自動跳轉到新的域名,客戶經過多次訪問,發現只要輸入新的域名就能訪問了,而且輸入更加簡單友好。

下面我們結合上述的場景來具體闡述如何進行配置:

1.首先我們是yum安裝的,上面已經注釋了其主配置文件(是一個默認的配置文件,功能必然沒有手工編譯豐富):/etc/nginx/conf.d/default.conf,簡要介紹一下其文件內容結構

[root@localhost named]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# ls
default.conf
[root@localhost conf.d]# cat default.conf 
server {
    listen       80;                           #監聽端口
    server_name  localhost;                    #域名,一般是指服務器的域名

    #charset koi8-r;                          #字符設置 
    #access_log  /var/log/nginx/host.access.log  main;      #訪問日志路徑設置

    location / {    #location 有”定位”的意思, 根據Uri來進行不同的定位,Uri可以理解為資源對應于URL是地址
        root   /usr/share/nginx/html;      
        index  index.html index.htm;
    }
    #location可以把網站的不同部分,定位到不同的處理方式上

    #error_page  404              /404.html;    #404訪問錯誤頁面找不到

    # redirect server error pages to the static page /50x.html           
    #
    error_page   500 502 503 504  /50x.html;              #錯誤頁面,服務器出問題
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

2.更改配置操作:更改域名、域名重定向

 server {
    listen       80;                    
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        if ($host = 'www.lokott.com'){
                rewrite ^/(.*)$ http://www.newlokott.com/$1 permanent;
        }

3.開啟nginx服務關閉防火墻

[root@localhost conf.d]# systemctl start nginx
[root@localhost conf.d]# systemctl stop firewalld.service 
[root@localhost conf.d]# setenforce 0

4.測試是否正常跳轉

在win10上輸入舊的域名:www.lokott.com是否正常跳轉為www.newlokott.com

舊域名輸入界面,按完回車后跳轉為下面第二張界面,可以驗證的確將舊域名跳轉到新的域名了。

Nginx Rewrite的實現原理和使用方法

Nginx Rewrite的實現原理和使用方法

2.2  rewrite規則配置應用場景二:基于ip地址

簡單描述:公司網頁正在做維護或者結構調整,目前只允許合法的ip地址訪問公司的頁面,其他的就跳轉到維護或者其他頁面。

具體配置:

1.設置一個合法的標志位;set $rewrite true;

2.判斷是否是合法的IP,是就正常跳轉,否則跳轉為main.html頁面;

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    set $rewrite true;                      #由此開始配置場景二
    if ($remote_addr = "192.168.68.151"){
        set $rewrite false;
    }   

    if ($rewrite = true){
        rewrite (.+) /main.html;
    }

    location = /main.html {
        root /usr/share/nginx/html;
    }                                       #到此配置二結束

    location / {
        #if ($host = 'www.lokott.com'){     #注釋場景一的配置
        #       rewrite ^/(.*)$ http://www.newlokott.com/$1 permanent;
        #}
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

3.將main.html頁面寫到/usr/share/nginx/html/下

[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# echo "this is a maintenance web page" > main.html
[root@localhost html]# ls
50x.html  index.html  main.html

4.重啟nginx服務,然后之后檢驗

[root@localhost html]# systemctl restart nginx
[root@localhost html]# netstat -antp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      64979/nginx: master 

5.根據上面的配置,結果應該是IP地址為192.168.68.151的主機是可以正常訪問的,其他的則無法訪問。

實際的結果如下:

Nginx Rewrite的實現原理和使用方法

換一臺centos虛擬機測試則無法訪問正常的頁面

Nginx Rewrite的實現原理和使用方法

下面,我們對于剛剛配置文件的內容做邏輯層面上的梳理與對應解釋:

截取關鍵部分的配置命令:

set $rewrite true;                      #設置一個標志位用來進行不同的判斷從而觸發不同的操作過程
if ($remote_addr = "192.168.68.151"){   #判斷請求訪問的主機ip地址是否是被允許的(只有該地址有權限進行正常訪問)
set $rewrite false;                           #更改標志位的值,從而不觸發原本為true的操作,即不執行下面兩段的操作
}

if ($rewrite = true){                                 #若是非法地址訪問則該標志位仍然為true,從而執行該段內容
rewrite (.+) /main.html;
}

location = /main.html {           #基于上面的true匹配在精確匹配進行具體操作執行的定位,訪問的是維護頁面
root /usr/share/nginx/html;
}

所以根據邏輯上的理解,我們知道只有被設置為允許的ip地址的客戶機才能正常訪問公司頁面,則其他的沒有改權限,相當于做了一個“白名單”。

2.3  rewrite規則配置應用場景三:基于跳轉到新域名后面有目錄的情況

場景簡述:加入訪問的是www.lokott.com/p,現在需要將這個域名下面的發帖都跳轉到bbs.lokott.com/ss/p,

1.我們仍然對默認主配置文件進行修改

[root@localhost ~]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    set $rewrite true;
    if ($remote_addr = "192.168.68.151"){
        set $rewrite false;
    }   

    if ($rewrite = true){
        rewrite (.+) /main.html;
    }

    location = /main.html {
        root /usr/share/nginx/html;
    }

    location /p {                                      #第三個場景配置
        rewrite (.+) http://bbs.lokott.com/ss$1 permanent;    
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

2.重啟服務

[root@localhost html]# systemctl restart nginx

3.在win10虛擬機上測試

Nginx Rewrite的實現原理和使用方法

Nginx Rewrite的實現原理和使用方法

由此現象可見,上述$1的含義是:你所定義的location的/p目錄之后的內容,具體為何需要你自己創建站點,例如:

在/usr/local/nginx/html目錄下創建ss/p/index.html網頁,網頁內容為“hello world” ,在使用http://www.lokott.com/p/index訪問時將會如下圖跳轉:

Nginx Rewrite的實現原理和使用方法

2.4  rewrite規則配置應用場景四:基于多參數匹配

場景簡述:在訪問www.lokott.com域名時在后面輸入已經規定的參數,實現規則跳轉,例如:輸入http://www.lokott.com/100-200-4454.html則跳到首頁

1.更改配置文件

server {
    listen       80;
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    if ($request_uri ~ ^/100-(100|200)-(\d+).html$){     #第四個場景
        rewrite (.*) http://www.lokott.com permanent;      //
    }
    #上述涉及的正則:^——開頭 | 或   \ 轉義  d+ 數字匹配
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

2.重啟服務

[root@localhost html]# systemctl restart nginx
[root@localhost html]# echo "asda" > 100-200-4454.html
[root@localhost html]# ls
100-200-4454.html  50x.html  index.html 
[root@localhost html]# echo "asda" > 100.html

3.測試驗證

Nginx Rewrite的實現原理和使用方法

Nginx Rewrite的實現原理和使用方法

在站點目錄在創建一個100.html文件,內容為asda,然后進行測試,結果如下:

Nginx Rewrite的實現原理和使用方法

2.5 rewrite規則配置應用場景五:基于文件后綴名訪問

場景簡述:訪問upload目錄下的php文件時跳轉至主頁面

1.修改配置文件

server {
    listen       80;
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location ~* /upload/.+\.php$ {                       #第五個場景
        rewrite (.+) http://www.lokott.com permanent;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

2.重啟服務

[root@localhost html]# systemctl restart nginx

3.測試驗證

Nginx Rewrite的實現原理和使用方法

跳轉的頁面:

Nginx Rewrite的實現原理和使用方法

2.6 rewrite規則配置應用場景六:基于指定文件(具體頁面)匹配

場景簡述:訪問固定的頁面時跳轉到首頁

1.修改配置文件

server {
    listen       80;
    server_name  www.lokott.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location ~* ^/abc/123.html {                         #第六個場景
        rewrite (.+) http://www.lokott.com permanent;
    }
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

2.重啟服務

[root@localhost html]# systemctl restart nginx

3.測試驗證

Nginx Rewrite的實現原理和使用方法

跳轉頁面如下:

Nginx Rewrite的實現原理和使用方法

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北川| 凤台县| 海口市| 广宗县| 富锦市| 明水县| 嘉荫县| 孙吴县| 浑源县| 嵩明县| 九江市| 玛沁县| 新干县| 个旧市| 伊金霍洛旗| 汶川县| 宜春市| 廉江市| 息烽县| 遵化市| 河南省| 霍邱县| 乐至县| 上林县| 孝昌县| 三门峡市| 贵州省| 保定市| 故城县| 泰安市| 观塘区| 井研县| 邢台市| 宝坻区| 琼海市| 延寿县| 三江| 尉氏县| 静乐县| 武冈市| 龙里县|