Nginx正規表達式之比對操作符詳解
nginx可以在配置檔案中對某些内置變量進行判斷,進而實作某些功能。例如:防止rewrite、盜鍊、對靜态資源設定緩存以及浏覽器限制等等。由于nginx配置中有if指令,但是沒有對應else指令,是以判斷要分為比對和不比對。
字元串表達式支援正規表達式,能設定大小寫是否敏感。是以共有四個操作符,
如下:
~ 區分大小寫(大小寫敏感)比對成功
~* 不區分大小寫比對成功
!~ 區分大小寫比對失敗
!~* 不區分大小寫比對失敗
1: 限制某些類型的用戶端的通路
if指令
所有的Nginx内置變量都可以通過if指令和正規表達式來進行比對,并且根據比對結果進行一些操
代碼如下 | 複制代碼 |
location / { if ($http_user_agent ~ MSIE) { return 503; } } |
#限制IE通路
如果把MSIE改成 Mozilla 就基本上把IE和firefox這樣pc浏覽器限制了
2和3主要是針對盜鍊做處理
2:針對不同的檔案類型
可能這個指令是我們平時使用正則比對用的最多的指令:
代碼如下 | 複制代碼 |
location ~ .*.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { if ($http_referer ~* javagg.com) { #rewrite ^/ http://www.javagg.com/403.html; return 403; } } |
3:針對不同的目錄
代碼如下 | 複制代碼 |
location /img/ { root /data/img/; if ($http_referer ~* javagg.com) { rewrite ^/ http://www.admin99.net/images/error.gif #return 403; } } |
1.^~ 辨別符後面跟一個字元串。
Nginx将在這個字元串比對後停止進行正規表達式的比對(location指令中正規表達式的比對的結果優先使用),如:location ^~ /images/,你希望對/images/這個目錄進行一些特别的操作,如增加expires頭,防盜鍊等,但是你又想把除了這個目錄的圖檔外的所有圖檔隻進行增加expires頭的操作,這個操作可能會用到另外一個location,例如:location ~* .(gif|jpg|jpeg)$,這樣,如果有請求/images/1.jpg,nginx如何決定去進行哪個location中的操作呢?結果取決于辨別符^~,如果你這樣寫:location /images/,這樣nginx會将1.jpg比對到location ~* .(gif|jpg|jpeg)$這個location中,這并不是你需要的結果,而增加了^~這個辨別符後,它在比對了/images/這個字元串後就停止搜尋其它帶正則的location。
2.= 表示精确的查找位址,
如location = /它隻會比對uri為/的請求,如果請求為/index.html,将查找另外的location,而不會比對這個,當然可以寫兩個location,location = /和location /,這樣/index.html将比對到後者,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。
[email protected] 表示為一個location進行命名,即自定義一個location,這個location不能被外界所通路,隻能用于Nginx産生的子請求,主要為error_page和try_files。
注意,這3個辨別符後面不能跟正規表達式,雖然配置檔案檢查會通過,而且沒有任何警告,但是他們并不會進行比對。
綜上所述,location指令對于後面值的比對順序為:
1.辨別符“=”的location會最先進行比對,如果請求uri比對這個location,将對請求使用這個location的配置。
2.進行字元串比對,如果比對到的location有^~這個辨別符,比對停止傳回這個location的配置。
3.按照配置檔案中定義的順序進行正規表達式比對。最早比對的location将傳回裡面的配置。
4.如果正規表達式能夠比對到請求的uri,将使用這個正則對應的location,如果沒有,則使用第二條比對的結果。
版權聲明:本文為CSDN部落客「weixin_34138139」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34138139/article/details/92384612