Nginx服務(wù)器中的location配置詳解
語法
location [=|~|~*|^~] /uri/ {...}
規(guī)則
= : 表示精確的URI匹配(有興趣的同學(xué)可以看一下url和uri的區(qū)別)
~: 表示區(qū)分大小寫的正則匹配
~*:表示不區(qū)分大小寫的正則匹配
!~ && !~*:表示區(qū)分大小寫不匹配的正則和不區(qū)分大小寫的不匹配的正則
/:通用匹配,任何請求都會匹配到
location匹配目標(biāo)
location匹配測試只使用請求URI的部分,而不使用參數(shù)部分。(原因:參數(shù)的寫法太多,無法精確匹配)
location匹配順序
多個location配置的前提下,location的匹配順序(未驗證,嘿嘿,google上搜的)
1.首先匹配=
2.其次匹配^~
3.再其次按照配置文件的順序進行正則匹配、
4.最后是交給/進行通用匹配
注意:
當(dāng)有匹配成功時,立刻停止匹配,按照當(dāng)前匹配規(guī)則處理請求
演示實例
nginx 配置文件,自下到上分為三種層次分明的結(jié)構(gòu):
| http block the protocol level
| server block the server level
V location block the requested URI
Nginx 允許用戶定義 Location block ,并指定一個匹配模式(pattern)匹配特定的 URI。除了簡單的字符串(比如文件系統(tǒng)路徑),還允許使用更為復(fù)雜的匹配模式(pattern)。
Location block 的基本語法形式是:
location [=|~|~*|^~|@] pattern { ... }
[=|~|~*|^~|@] 被稱作 location modifier ,這會定義 Nginx 如何去匹配其后的 pattern ,以及該 pattern 的最基本的屬性(簡單字符串或正則表達式)。
關(guān)于 location modifier
1. =
這會完全匹配指定的 pattern ,且這里的 pattern 被限制成簡單的字符串,也就是說這里不能使用正則表達式。
Example:
server { server_name jb51.net; location = /abcd { […] } }
匹配情況:
http://jb51.net/abcd # 正好完全匹配
http://jb51.net/ABCD # 如果運行 Nginx server 的系統(tǒng)本身對大小寫不敏感,比如 Windows ,那么也匹配
http://jb51.net/abcd?param1?m2 # 忽略查詢串參數(shù)(query string arguments),這里就是 /abcd 后面的 ?param1?m2
http://jb51.net/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),Nginx 不認為這種情況是完全匹配
http://jb51.net/abcde # 不匹配,因為不是完全匹配
2. (None)
可以不寫 location modifier ,Nginx 仍然能去匹配 pattern 。這種情況下,匹配那些以指定的 patern 開頭的 URI,注意這里的 URI 只能是普通字符串,不能使用正則表達式。
Example:
server { server_name website.com; location /abcd { […] } }
匹配情況:
http://jb51.net/abcd # 正好完全匹配
http://jb51.net/ABCD # 如果運行 Nginx server 的系統(tǒng)本身對大小寫不敏感,比如 Windows ,那么也匹配
http://jb51.net/abcd?param1?m2 # 忽略查詢串參數(shù)(query string arguments),這里就是 /abcd 后面的 ?param1?m2
http://jb51.net/abcd/ # 末尾存在反斜杠(trailing slash)也屬于匹配范圍內(nèi)
http://jb51.net/abcde # 仍然匹配,因為 URI 是以 pattern 開頭的
3. ~
這個 location modifier 對大小寫敏感,且 pattern 須是正則表達式
Example: server { server_name jb51.net; location ~ ^/abcd$ { […] } }
匹配情況:
http://jb51.net/abcd # 完全匹配
http://jb51.net/ABCD # 不匹配,~ 對大小寫是敏感的
http://jb51.net/abcd?param1?m2 # 忽略查詢串參數(shù)(query string arguments),這里就是 /abcd 后面的 ?param1?m2
http://jb51.net/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),并不匹配正則表達式 ^/abcd$
http://jb51.net/abcde # 不匹配正則表達式 ^/abcd$
注意:對于一些對大小寫不敏感的系統(tǒng),比如 Windows ,~ 和 ~* 都是不起作用的,這主要是操作系統(tǒng)的原因。
4. ~*
與 ~ 類似,但這個 location modifier 不區(qū)分大小寫,pattern 須是正則表達式
Example:
server { server_name website.com; location ~* ^/abcd$ { […] } }
匹配情況:
http://jb51.net/abcd # 完全匹配
http://jb51.net/ABCD # 匹配,這就是它不區(qū)分大小寫的特性
http://jb51.net/abcd?param1?m2 # 忽略查詢串參數(shù)(query string arguments),這里就是 /abcd 后面的 ?param1?m2
http://jb51.net/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),并不匹配正則表達式 ^/abcd$
http://jb51.net/abcde # 不匹配正則表達式 ^/abcd$
5. ^~
匹配情況類似 2. (None) 的情況,以指定匹配模式開頭的 URI 被匹配,不同的是,一旦匹配成功,那么 Nginx 就停止去尋找其他的 Location 塊進行匹配了(與 Location 匹配順序有關(guān))
6. @
用于定義一個 Location 塊,且該塊不能被外部 Client 所訪問,只能被 Nginx 內(nèi)部配置指令所訪問,比如 try_files or error_page
演示實例
產(chǎn)生的效果如下:
訪問根目錄/,匹配到location /
訪問除hello.php之外的其它php程序,匹配到location ~ \.php$,并且用php5-fpm去運行
訪問hello.php,匹配到location = /hello.php,訪問被重定向到好聯(lián)系官網(wǎng)
相關(guān)文章
nginx設(shè)置上傳目錄無執(zhí)行權(quán)限的方法
在windows+iis下,可以設(shè)置上傳目錄,類似:upload,uploadfile,attachments,這樣的目錄下面無腳本執(zhí)行權(quán)限,從而防止非法用戶上傳腳本得到webshell2010-11-11基于nginx獲取代理服務(wù)ip以及客戶端真實ip詳解
最近在研究nginx中如何獲取真實客戶端IP的方法,下面這篇文章主要給大家介紹了基于nginx獲取代理服務(wù)ip以及客戶端真實ip的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07nginx實現(xiàn)一個域名配置多個laravel項目的方法示例
這篇文章主要介紹了nginx實現(xiàn)一個域名配置多個laravel項目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01nginx正向代理http和https的實現(xiàn)步驟
本文主要介紹了nginx正向代理http和https的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07