基本語法格式: Location block 的基本語法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被稱作 location modifier ,這會定義 Nginx 如何去匹配其後的 pattern ,以及該 pattern ...
基本語法格式:
Location block 的基本語法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被稱作 location modifier ,這會定義 Nginx 如何去匹配其後的 pattern ,以及該 pattern 的最基本的屬性(簡單字元串或正則表達式)
location 的匹配符
1.等於匹配符:=
等於匹配符就是等號,特點可以概括為兩點: 精確匹配,優先順序最高,匹配成功後則停止向下搜索 不支持正則表達式server { server_name website.com; location = /abcd { […] } } 匹配情況: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果運行 Nginx server 的系統本身對大小寫不敏感,比如 Windows ,那麼也匹配 http://website.com/abcd?param1m2 # 忽略查詢串參數(query string arguments),這裡就是 /abcd 後面的 ?param1m2 http://website.com/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),Nginx 不認為這種情況是完全匹配 http://website.com/abcde # 不匹配,因為不是完全匹配
2.空匹配符
空匹配符的特點是: 匹配以指定模式開始的 URI,區分大小寫,字元串匹配 不支持正則表達式# 可以不寫 location modifier ,Nginx 仍然能去匹配 pattern 。這種情況下,匹配那些以指定的 patern 開頭的 URI,註意這裡的 URI 只能是普通字元串,不能使用正則表達式。 server { server_name website.com; location /abcd { […] } } 匹配情況: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果運行 Nginx server 的系統本身對大小寫不敏感,比如 Windows ,那麼也匹配 http://website.com/abcd?param1m2 # 忽略查詢串參數(query string arguments),這裡就是 /abcd 後面的 ?param1m2 http://website.com/abcd/ # 末尾存在反斜杠(trailing slash)也屬於匹配範圍內 http://website.com/abcde # 仍然匹配,因為 URI 是以 pattern 開頭的
3.正則匹配符:~ 和 ~*
正則匹配符是可以使用正則表達式的匹配符。不過這裡要強調的是,一般來說~是指: 區分大小寫的正則匹配 但是對於一些對大小寫不敏感的操作系統,這兩者沒有區別。另外一個就是^~,其表示以指定模式開始的正則匹配。# 這個 location modifier 對大小寫敏感,且 pattern 須是正則表達式 server { server_name website.com; location ~ ^/abcd$ { […] } } 匹配情況: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 不匹配,~ 對大小寫是敏感的 http://website.com/abcd?param1m2 # 忽略查詢串參數(query string arguments),這裡就是 /abcd 後面的 ?param1m2 http://website.com/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),並不匹配正則表達式 ^/abcd$ http://website.com/abcde # 不匹配正則表達式 ^/abcd$ # 註意:對於一些對大小寫不敏感的系統,比如 Windows ,~ 和 ~* 都是不起作用的,這主要是操作系統的原因。
~* 表示:不區分大小寫的正則匹配
server { server_name website.com; location ~* ^/abcd$ { […] } } 匹配情況: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 匹配,這就是它不區分大小寫的特性 http://website.com/abcd?param1m2 # 忽略查詢串參數(query string arguments),這裡就是 /abcd 後面的 ?param1m2 http://website.com/abcd/ # 不匹配,因為末尾存在反斜杠(trailing slash),並不匹配正則表達式 ^/abcd$ http://website.com/abcde # 不匹配正則表達式 ^/abcd$
4. ^~
匹配情況類似 2. (空字元) 的情況,以指定匹配模式開頭的 URI 被匹配,不同的是,一旦匹配成功,那麼 Nginx 就停止去尋找其他的 Location 塊進行匹配了(與 Location 匹配順序有關)5. 內部訪問符:@
用於定義一個 Location 塊,且該塊不能被外部 Client 所訪問,只能被 Nginx 內部配置指令所訪問,比如 try_files or error_page。一般用於錯誤頁面等。匹配符優先順序
Location匹配規則 語法規則: 【= | ^~ | ~ | ~* | / | /uri 】location = /uri = 表示精確匹配,只有完全匹配上才能生效,若找到,停止搜索; location ^~ /uri ^~開頭表示對URL路徑進行首碼匹配,並且在正則匹配之前,若找到,停止搜索; location ~ pattern ~開頭表示區分大小寫的正則匹配,按配置文件順序匹配; location ~* pattern ~*開頭表示不區分大小寫的正則匹配,按配置文件順序匹配; location !~和!~* 分別為區分大小寫不匹配及不區分大小寫不匹配 的正則 location /uri 不帶任何修飾符,表示首碼匹配,在正則匹配之後; location / 通用匹配,任何未匹配到其他location的請求都會匹配到,相當於default;
多個location配置的情況匹配順序為
首先精確匹配 = ; 其次首碼匹配 ^~; 其次是按照配置文件中的正則匹配; 然後匹配不帶任何修飾符的首碼匹配; 最後交給/通用匹配
案例
location = / { # 精確匹配 / ,主機名後面不能帶任何字元串 [ configuration A ] } location / { # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求 # 但是正則和最長字元串會優先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索 # 只有後面的正則表達式沒有匹配到時,這一條才會採用這一條 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索 # 只有後面的正則表達式沒有匹配到時,這一條才會採用這一條 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜索正則,採用這一條。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 結尾的請求 # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則 [ configuration E ] } location /images/ { # 字元匹配到 /images/,繼續往下,會發現 ^~ 存在 [ configuration F ] } location /images/abc { # 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在 # F與G的放置順序是沒有關係的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,採用 [ configuration H ] } location ~* /js/.*/\.js
每天記錄一點,就能多學一點,充實一點