本文翻譯自 www.keycdn.com/support/ngi…php
Nginx location
是使用 nginx 的過程當中必需要掌握的技能,不管是在server blocks
仍是其餘 location blocks
中都會用到,這篇文章簡單介紹了當請求來臨時location
指令是如何處理客戶端URI
請求的.html
Nginx 將配置按照層級關係,用塊狀形式進行配置,每當一個請求來臨時,nginx 服務器就會處理這個請求到底會映射到哪一個塊配置.在 Nginx 的配置文件中,兩種主要的塊配置是:nginx
server
塊配置location
塊配置 server
的塊配置包含一系列的虛擬 server 配置,多個 server 配置就能夠對多個 domain name 的請求,也包括 ip 端口進行處理. 而location
配置在server
塊配置中起着相當重要的做用,決定了URI
或者資源請求應該如何被處理,這些 URI 請求能夠被拆分爲多個location
的配置以下就是經常使用的 location 配置的語法格式,其中modifier
是可選的,location_match
就是制定 URI 應該去往哪一個配置的關鍵.web
location optional_modifier location_match {
. . .
}
複製代碼
Regular expressions(RE)或者字面量均可以用來定義modifier
,若是 location 配置中制定了modifier,可能會改變 nginx匹配 location的方式,以下介紹幾種最重要的modifier:正則表達式
=
等號表示當前這個 location 會匹配一個肯定的請求,配置什麼就匹配什麼請求,若是匹配上了,就會中止搜索.~
波浪號表示當前這個 location 會當成一個大小寫敏感的RE匹配.~*
波浪號跟星號標識 location 會按照大小寫不敏感的 RE 匹配.^~
非表達式(RE)匹配,正則表達式將不會生效.對於每一個請求來講,nginx 會選擇最匹配的一個 location 來處理這個請求,nginx 其實就是經過對比這些 location 規則來選擇一個 location,對比的順序能夠總結爲:express
=
匹配,若是當前請求匹配上了,搜索將會中止,直接使用這個這個 location.^~
這個modifier,nginx 會中止搜索並直接使用這個 location. 3.2 若是沒有使用 ^~
,暫存這個 location而且繼續搜索.~
和~*
),第一個匹配上這種會被當作有效的 location來處理這個請求.注:因此 沒有修飾符的 location 實際上是很浪費資源的,能夠用 ^~ 來替代.服務器
以下是一些 location 配置的例子,用來詳細描述上面所說的處理順序,你也能夠按照具體實際狀況來修改這些例子.dom
location = / {
# 只處理請求 /.
}
複製代碼
location /data/ {
# 全部以 /data/ 匹配,可是還會繼續搜索.
# 若是沒有其餘 location 匹配上,就用這個處理請求.
}
複製代碼
location ^~ /img/ {
# 全部以 /img/ 開頭的請求而且會中止搜索.
}
複製代碼
location ~* .(png|gif|ico|jpg|jpeg)$ {
# 以png, gif, ico, jpg ,jpeg結尾的請求.
# 若是請求是到 /img/ 路徑的話 仍是會被上面👆的 location 處理
}
複製代碼
如何防止圖片盜鏈:jsp
location ~ .(png|gif|jpe?g)$ {
valid_referers none blocked yourwebsite.io *.yourwebsite.io;
if ($invalid_referer) {
return 403;
}
}
複製代碼
在可寫權限的目錄禁止腳本:spa
location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
return 403;
}
複製代碼
更多 nginx location 指令的信息,能夠參見官網:Nginx