在實際應用中,許可權控制的需求更加複雜。例如,對於**下的 img 目錄允許所有用
戶訪問,但對於**下的 admin 目錄則僅允許管理員身份的使用者訪問。此時,僅靠 deny
和 allow 這兩個許可權指令不能滿足使用者的需求,還需要使用 location 塊來完成相 關需求的
匹配。首先要簡單了解 location 的相關語法及規定,具體如下。
根據表的描述,可將 location 根據不同字首的使用方式,大致分為普通 location與正則 location 其中,~ 和~* 屬於正則 location ,其餘的字首和沒有字首的情況都屬於普location
接下來,通過 location 塊和許可權控制指令,逐一演示訪問控制的幾種典型使用方式。
1. 精準匹配
所謂精準匹配指的就是使用者訪問的 uri 與指定的 uri 完全一致的情況,才會執行其
後的指令塊,示例配置如下
上述第 6~8 行和第 9~11 行配置設定了兩個精準匹配,第 12 行用於禁止所有使用者的訪問 。當上述配置中允許訪問的兩個客戶端,請求**根目錄下不存在的檔案或目錄時,如果符合匹配規則,網頁顯示 404 not found ,不符合時顯示 403 forbidden。
假設**根目錄下沒有任何檔案,下面使用 ip 192. 168. 78. 128 使用者和 ip
192. 168. 78 . 200 使用者通過不同的 url 進行訪問測試,其對應的響應結果如下表 所示
從上表可以看出,精準匹配是只有使用者請求的 uri location 中定義的匹配模式完全一致的情況下,才會執行其後的指令塊,否則匹配不成功
2. 正則匹配
nginx 配置檔案中,多個正則 location 之間按照正則 location 在配置檔案中的書寫順序進行匹配,且只要匹配成功就不會繼續匹配後面定義的正則 location. 下面在 ip192. 168. 78. 的虛擬機器中,設定以下兩個正則 location 訪問控制,具體如下
在上述配置中,第 1行表示匹配**根目錄下以. html 結尾的檔案,第 4行表示匹配**根目錄下 aaa 目錄中以. html 結尾的檔案。
下面使用 192. 168. 78. 128 的使用者通過不同的 url 進行訪問測試, 其對應的響應結果如表所示
從上表 可以看出,當 location 中的 uri 與使用者請求中以 html 為結尾的檔案匹配上時,正則 location 停止了繼續匹配,因此顯示結果都為 404 not found
接下來,調換第1~3 行與第 4~6行**的編寫順序,再次訪問 http: // 192 168. 78 . 3/test. html 結果依然為 404 not found ,而訪問 ttp // 192 168. 78 . 3/ aaa/ test. html 的結果
403 forbidden。
從上述兩組測試對比可總結出,正則 location 的編寫順序不同,則結果不同,且只有前
面定義的正則 location 匹配不成功的情況下,才會繼續匹配後面的正則 location 。因此,讀
者在實際應用中要注意正則 location 在配置檔案中的書寫順序。
最大字首匹配
由於 location 可以同時定義多個,當 乙個配置檔案中同時出現多個 location時,普通location 之間遵循「最大字首匹配」原則通俗地講就是,匹配度最高的 location 將會執行,
示例如下
下面利用不同的 url 進行訪問測試,對應的響應結果如下表所示。
值得 提的是,當最大字首 location 與正則 location 同時存在時,如果正則location
配成功,則不會執行最大字首 location 。具體示例如下。
上述配置中,第1~3 行定義的是最大字首 location ,用於匹配當前**根目錄下的所有檔案,第4~6行用於正則匹配所有以 html 結尾的 ur 不同 及其對應的響應結果,如下表所示
從上表可以看出,當使用者訪問 http //192. 168. 78. 時,完成第1 行的匹配;而在使用者訪問 http: //192. 168. 78. 3/notfound. html 和 http //192. 168. 78. 3/ index. php 時,前者符合正則 location ,結果為 404 not found ,而後者不符合正則 location ,顯示了最大字首匹配的結果 403 forbidden。
附錄: root 與alias 的區別
Nginx Location 指令基礎
nginx 中的 location 指令 是nginxhttpcoremodule中重要指令。location 指令比較簡單,但卻是配置 nginx 過程中不得不去了解的。location 指令,是用來為匹配的 uri 進行配置,uri 即語法中的 uri 可以是字串或正規表示式。但如果要使用正規表...
nginx location匹配規則
location匹配命令 波浪線表示執行乙個正則匹配,區分大小寫 表示執行乙個正則匹配,不區分大小寫 表示普通字元匹配,不使用正規表示式,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄 進行普通字元精確匹配 定義乙個命名的 location,使用在內部定向時,例如 error pag...
nginx location匹配規則
location匹配命令 波浪線表示執行乙個正則匹配,區分大小寫 表示執行乙個正則匹配,不區分大小寫 表示普通字元匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄 進行普通字元精確匹配 定義乙個命名的 location,使用在內部定向時,例如 error page,try fil...