Nginx服務器利用 ngx_http_rewrite_module 模塊解析和處理rewrite請求,此功能依靠 PCRE(perl compatible regular expression),因此編譯之前要安裝PCRE庫,rewrite是nginx服務器的重要功能之
一,用于實現URL的重寫,URL的重寫是非常有用的功能,比如它可以在我們改變網站結構之后,不需要客戶端修改原來的書簽,也無需其他網站修改我們的鏈接,就可以設置為自動訪問,另外還可以在一定程度上提高網站的安全性。
ngx_http_rewrite_module模塊指令
官方文檔: Module ngx_http_rewrite_module
if 指令
官方文檔:
Module ngx_http_rewrite_module
- if指令可以配置在server或location塊中
- if指令用于條件匹配判斷,并根據條件判斷結果選擇不同的Nginx配置
- Nginx的if語法僅能使用if做單次判斷,不支持使用if else或者if elif這樣的多重判斷
- 使用正則表達式對變量進行匹配,匹配成功時if指令認為條件為true,否則認為false
用于條件匹配判斷,并根據條件判斷結果選擇不同的Nginx配置,可以配置在server或location塊中進行配置,Nginx的if語法僅能使用if做單次判斷,不支持使用if else或者if elif這樣的多重判斷,用法如下:
if (條件匹配) { ?action
}
使用正則表達式對變量進行匹配,匹配成功時if指令認為條件為true,否則認為false,變量與表達式之間使用以下符號鏈接:
= #比較變量和字符串是否相等,相等時if指令認為該條件為true,反之為false
!= ?#比較變量和字符串是否不相等,不相等時if指令認為條件為true,反之為false
~ #區分大小寫字符,可以通過正則表達式匹配,滿足匹配條件為真,不滿足匹配條件為假
!~ #區分大小寫字符,判斷是否匹配,不滿足匹配條件為真,滿足匹配條件為假
~* #不區分大小寫字符,可以通過正則表達式匹配,滿足匹配條件為真,不滿足匹配條件為假
!~* #不區分大小字符,判斷是否匹配,滿足匹配條件為假,不滿足匹配條件為真
-f 和 !-f #判斷請求的文件是否存在和是否不存在
-d 和 !-d #判斷請求的目錄是否存在和是否不存在
-x 和 !-x #判斷文件是否可執行和是否不可執行
-e 和 !-e #判斷請求的文件或目錄是否存在和是否不存在(包括文件,目錄,軟鏈接)
#注意:
#如果$變量的值為空字符串或0,則if指令認為該條件為false,其他條件為true。
#nginx 1.0.1之前$變量的值如果以0開頭的任意字符串會返回false
?return 指令
- return用于完成對請求的處理,并直接向客戶端返回響應狀態碼
- return可以在server、location塊和 if 進行配置
- 處于此指令后的所有配置都將不被執行
語法格式:
Syntax:????????return code [text];? //返回給客戶端的狀態碼及響應報文的實體內容return code URL;??? //返回給客戶端的URL地址return URL;
Default:????????—
Context:????????server, location, if
狀態碼 301 和 302
狀態碼 | 含義 | 區別 |
301 | 永久重定向 | 服務器不需要每次向客戶提供新的url,客戶訪問過后會記錄在自己的緩存中,即使nginx服務器死機,客戶在一定時間內也可以繼續跳轉 |
302 | 臨時重定向 | 沒有緩存,服務器斷開無法重定向 |
?
?
set 指令
- set定義格式為set $key value
- 指定key并給其定義一個變量,變量可以調用Nginx內置變量賦值給key
- value可以是text, variables和兩者的組合
語法格式:
Syntax:????????set $variable value;
Default:????????—
Context:????????server, location, if
break 指令
- 用于中斷 當前相同作用域(location)中的其他Nginx配置,與該指令處于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模塊中指令就不再執行。
語法格式:
Syntax:????????break;
Default:????????—
Context:????????server, location, if
rewrite 指令
- 通過正則表達式的匹配來改變URI,可以同時存在一個或多個指令,按照順序依次對URI進行匹配,rewrite主要是針對用戶請求的URL或者是URI做具體處理
語法格式:
Syntax:????????rewrite regex replacement [flag];
Default:????????—
Context:????????server, location, if//正則匹配原始訪問url??? 替代你想讓客戶訪問的???? 標志 ()premanent301?? redirect302? break? last
flag 說明:
類型 | flag | 區別 |
跳轉型 | redirect | 臨時重定向302 |
? | permanent | 永久重定向301 |
代理型 | break | 是立即終止匹配 ?使用該url進行匹配 |
? | last | 停止本location中的匹配,開啟新一輪的location匹配 |
- 跳轉型指由客戶端瀏覽器重新對新地址進行請求
- 代理型是在WEB服務器內部實現跳轉
- break 和 last 是為了防止死循環使用的
防盜鏈
防盜鏈基于客戶端攜帶的referer實現,referer是記錄打開一個頁面之前記錄是從哪個頁面跳轉過來的標記信息,如果別人只鏈接了自己網站圖片或某個單獨的資源,而不是打開了網站的整個頁面,這就是盜鏈,referer就是之前的那個網站域名,正常的referer信息有以下幾種:
none:請求報文首部沒有referer首部,比如用戶直接在瀏覽器輸入域名訪問web網站,就沒有referer信息。
blocked:請求報文有referer首部,但無有效值,比如為空。
server_names:referer首部中包含本主機名及即nginx 監聽的server_name。
arbitrary_string:自定義指定字符串,但可使用 * 作通配符。示例:*.kgc.org 或 www.kgc.*
regular expression:被指定的正則表達式模式匹配到的字符串,要使用 ~ 開頭,例如:~.*.kgc.com
?
location ~* \.(jpg|gif|swf)$ {???????????root? /data/nginx/pc;valid_referers none blocked *.pc.com pc.com;??if ( $invalid_referer ) {rewrite ^/ http://www.pc.com/error.png;#return? 403}}??????????????
~* \.(jpg|gif|swf)$:這段正則表達式表示匹配不區分大小寫,以.jpg 或.gif 或.swf 結尾的文件Valid_referers:設置信任的網站,可以正常使用圖片。None :瀏覽器中 referer 為空的情況,就是直接在瀏覽器訪問圖片。Blocked :referer 不為空的情況 ,但是值被代理或防火墻刪除了,這些值不以 http://或https://開頭。后面的網址或者域名:referer 中包含相關字符串的網址。If 語句:如果鏈接的來源域名不在 valid_referers 所列出的列表中,$invalid_referer 為1,則執行后面的操作,即進行重寫或返回 403 頁面。
?實際操作
#機器一
server {listen 80;server_name www.cc.com;root /data/html;index index.html;
location ~* \.(jpg|gif|swfjepg|bmp)$ {
#訪問時已上面這些結尾時跳轉到/data/html/tp文件夾下
root /data/html/tp;
}
}
#在/data/html/tp站點下加入一張測試圖片a.jpg#盜圖機器二
需要在/etc/hosts文件下加入www.cc.com的域名解析#設置盜圖機器的主站點
server {
listen 80;
server_name www.dao.com;
root /data/;
}#在主站點下寫一個index.html文件
vim ?index.html
<html>
<body>
<h1>this is daotu ?</h1>
<img src="http://www.cc.com/a.jpg"/>
</body>
</html>
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?