天天看點

Nginx基礎知識之rewrite重定向的規則

作者:王嘯皓月山巅

Nginx重定向:

一般設定return 403;之後,網頁的頁面會出現:

403 Forbidden

----------------

nginx

這種顯示。

---我是華麗的分隔線---

.點比對任何單字元

*比對前面的字元零次或者多次。

+比對前面的字元1次或者多次,也就是最少1次,相當于{1,}

?比對前面的字元0次或者1次,相當于{0,1}

---我是華麗的分隔線---

正規表達式配置的文法:

rewrite regex replacement [flag]

Regex使用pcre正規表達式。

regex是^/(.*)是一個正規表達式,表示比對所有,比對完整的域名和後面的路徑位址。

---我是華麗的分隔線---

目錄對換/123456/xxxx->/xxxx?id=123456:

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

\d比對一個數字字元,等價于[0-9]

+加比對前面的子表達式一次或者多次。

點.比對除了\n之外的任何單個字元

last:相當于apache裡面的[L]标記,表示完成rewrite。

---我是華麗的分隔線----

禁止通路以.sh、.flv、.mp4為檔案字尾的URL:

location ~ .*\.(sh|flv|mp4)?$ {return 403;}

? 比對前面的表子達式零次或者一次。

\. 将下一個字元标記為一個特殊字元。

----我是華麗的分隔線----

網站資訊防盜鍊:

在我們部署網站後,網站中的靜态資源,比如網站中的圖檔,可以被其他網站大量盜用。為了解決這個問題,可以根據referer資訊進行防盜鍊的設定,以免網站資源被非法盜用,造成經濟損失。

HTTP協定中有一個表示“頁面或者資源”來源的請求頭,這個請求頭我們叫做Rerferer。Referer表示請求是從哪個網址發出來的。

防盜鍊功能是基于HTTP協定支援的Referer機制,通過Referer跟蹤請求來源,對來源進行識别和判斷。

防盜鍊的配置可以在任意location{}下配置,不能在server{…}中配置。

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked www.yourdomain.com *.yourdomain.com;

if($invalid_referer) {

rewrite ^/(.*) http://www.yourdomain.com/blocked.html;

}

}

~* \.(gif|jpg|png|swf|flv)$:這段正規表達式表示比對不分大小寫,以.gif、.jpg、.png、.swf、.flv等結尾的檔案。

valid_referers設定信任的網站,可以正常使用圖檔。

後面的網站網址或者域名:referer中包含的字元串的網址。

if語句:如果連結的來源域名不在valid_referers的清單中,那麼$invalid_referer為1,執行後面的操作,即進行rewrite重寫。

防盜鍊的指令是valid_referers。可選值是none,blocked,server_name。預設值是none。

valid_referers指令會根據Referer Header頭的内容,配置設定一個值為0或者1給變量$invalid_referer。如果Referer Header不符合valid_referers設定的有效referer,那麼變量$invalid_referer将被設定為1。

valid_referers指令的參數可以是:

①:none 表示無Referer值的情況。

②: blocked 表示Referer值被防火牆僞裝。

③:server_name 表示一個或者多個主機名稱,server_name中可以使用通配符*星号。

介紹http頭referer資訊:

①:當浏覽器向web 伺服器發送請求時一般都會帶上referer,包含目前請求頁面的來源位址,即表示目前頁面是通過這個來源頁面裡面的連結進入的。

②:背景伺服器可以根據擷取的referer資訊,判斷是否是自己信任的網站位址。如果是,則放行繼續通路。如果否,則可以傳回403狀态資訊。

③:服務端一般使用referer請求頭識别通路來源,以進行統計分析、日志記錄和緩存優化等。

valid_referers:

檢視referer,自動和valid_referers後面的變量進行比對,如果比對到,就将invalid_referer變量置為0(false,合法)。如果沒有比對到,就将invalid_referer變量置為1(true,不合法)。比對的過程中不區分大小寫。

valid_referers的文法:

valid_referers none | blocked | server_names | string

none:如果Header中的Referer值為空,允許通路。

blocked: 在Header中的Referer不為空,但是該值被防火牆或者代理進行僞裝過,如不帶http://、https://等協定頭的資源,允許通路。

server_names:指定具體的域名或者IP,可以使用通配符*。

string:支援正規表達式、帶*的字元串。如果是正規表達式,需要以~開頭表示。表達式将與http://或者https://之後的文本進行比對。

使用if判斷$invalid_referer,0(false,合法,不進入if塊)/1(true,不合法,進入if塊)。

Nginx基礎知識之rewrite重定向的規則

鼓勵的話語:泰山崩于前,面不改色;大海嘯于後,而不變聲,為大丈夫!