摘要:然后檢查正則表達式,按照它們在配置文件中的顯示順序。正則表達式的搜索在第一個匹配中終止,并且使用相應的配置。正則表達式可以包含稍后可以在其他指令中使用的捕獲。
最近學習vuejs,做前后端分離,demo做完了,最終還是要發布的,于是學習nginx,其它配置倒是還好理解,唯獨對localtion理解不了,最后請教了一些網友,才得以解決問題,但是不希望下次還遇到問題,所以這里把localtion的配置規則,都嘗試一遍,也記錄一下,方便自己,也方便別人。
1、配置規則只要在網上搜一下,或者去官網翻一下文檔,都能知道有幾種規則,這是官網的:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location
總而言之,包含兩部分內容,一部分是匹配前提條件或者叫要求,另外一部分是要匹配的東西,也就是匹配內容。
下面這段是官網說明的谷歌翻譯:
在對“%XX”形式編碼的文本進行解碼之后,針對歸一化的URI執行匹配,解析對相對路徑組件“.”和“..”的引用,以及將兩個或多個相鄰斜杠可能壓縮為單個斜杠。 localtion可以由前綴字符串或正則表達式定義。正則表達式使用前面的“?*”修飾符(不區分大小寫匹配)或“?”修飾符(用于區分大小寫匹配)指定。要找到匹配給定請求的位置,nginx首先檢查使用前綴字符串(前綴位置)定義的位置。其中,選擇并記住具有最長匹配前綴的位置。然后檢查正則表達式,按照它們在配置文件中的顯示順序。正則表達式的搜索在第一個匹配中終止,并且使用相應的配置。如果沒有找到與正則表達式匹配,則使用之前記住的前綴位置的配置。 localtion blocks可以嵌套,下面提到一些例外。 對于不區分大小寫的操作系統,如macOS和Cygwin,與前綴字符串的匹配忽略了一個情況(0.7.7)。但是,比較僅限于一個字節的區域設置。 正則表達式可以包含稍后可以在其他指令中使用的捕獲(0.7.40)。 如果最長匹配的前綴位置具有“^?”修飾符,則不會檢查正則表達式。 另外,使用“=”修飾符可以定義一個完全匹配的URI和位置。如果找到完全匹配,則搜索終止。例如,如果頻繁出現“/”請求,則定義“location = /”將加快對這些請求的處理,因為搜索在第一次比較之后立即終止。這樣的位置不能明顯地包含嵌套的位置。 在從0.7.1到0.8.41的版本中,如果請求匹配前綴位置而沒有“=”和“^?”修飾符,則搜索也將被終止,而正則表達式未被檢查
根據上面的說明可知,默認情況, nginx先檢查前綴字符串,然后檢查正則表達式,如果前綴字符串匹配到了,并且前綴字符串有這個“^~” 要求,就不配正則了;如果沒有這個“^~” ,即使前綴匹配到了,也要去匹配正則表則,如果正則表達式匹配到了,就是用正則表達式的,沒有就是用前綴字符串匹配到的路徑;
2、無正則表達式匹配規則:使用匹配到的最長的前綴的路徑。
location / { root html; index index.html index.htm; } location /img { root D:/nginx/img; index test.png; }
這是nginx下載安裝完成后,增加了一個叫img的配置,訪問路徑是http://localhost/img,訪問一下看看什么效果,我開啟了日志,就不截圖了,直接看日志里,nginx查找的路徑:
D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)
文件查找的路徑是D:/nginx/img(這是我配置的路徑),下面的img文件下的test.png文件
如果改成這樣:
location / { root html; index index.html index.htm; } location /img/ { root D:/nginx/img; index test.png; }
看看有沒有區別,重新啟動,在訪問http://localhost/img試一下:
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)
和之前沒什么區別,也就是兩個效果是一樣的,在瀏覽其中http://localhost/img和http://localhost/img/是一樣的。
再改一下,重啟:
location / { root html; index index.html index.htm; } location /img/ { root D:/nginx/img/; index test.png; }
我在重新訪問一下:
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)
還是一樣的效果。
所以如果是前綴字符串匹配,就不要糾結后面要不要加“/”的問題。
另外從結果上看,確實符合規則,使用前綴最長的匹配路徑。
規則:無“^~”, 最終使用正則匹配到的路徑,正則匹配不到,使用字符串前綴匹配最長的
增加一個配置:
location /img/ { root D:/nginx/reg/; index test.png; }
重啟訪問:
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)
結果發現,找的還是D:/nginx/img的img文件夾的文件,好像正則沒有匹配上,改一下:
location /img { root D:/nginx/reg/; index test.png; }
這下一定可以匹配上了,重啟http://localhost/img測試:
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)
無語了,為什么沒有按照規則來呢,為什么沒有查找D:/nginx/reg/路徑下的文件呢?
回到前面看一下官網說明,發現正則表達式需要"~"或者"~*"指定才行,修改為下面的配置:
location ~* /img/ { root D:/nginx/reg/; index test.png; }
重啟訪問http://localhost/img測試:
"D:/nginx/reg/img/test.png"
這下按照規則了,看東西看來還是要認真看啊!
改一下正則表達式:
location ~* /img { root D:/nginx/reg/; index test.png; }
再重啟測試:
"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)
也可以正常匹配,也就是說正則匹配的情況下,最后一個/要不要都行,效果是一樣的
另外“~*” 不區分大小寫和“~”就不用試,應該都知道
3、精確匹配=號規則:精確匹配某個路徑,優先級最高
增加一種配置:
location = /img/test.png { root D:/nginx/denghao/; index test.png; }
重啟訪問路徑http://localhost/img/test.png:
"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)
從結果看出,和規則一致;
改一下配置:
location = /img/ { root D:/nginx/wuhouzhui/; index test.png; }
測試結果:
"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)
從結果上看,最終使用的匹配路徑是正則,至于 = /img/,有沒有匹配到,我也不清楚,總而言之,這種情況下使用的是正則的路徑,有知道朋友解釋一下=號有沒有匹配到。
4、提高前綴字符串的優先級的“^~”規則:如果最長匹配的前綴位置具有“^?”修飾符,則不會檢查正則表達式
因為先搜索匹配的是前綴字符串,所有匹配到了,有這個修飾符就不檢查正則了,所以正則就不考慮了。
把配置改一下:
location ^~ /img/ { root D:/nginx/img/; index test.png; } location = /img/test.png { root D:/nginx/denghao/; index test.png; }
訪問http://localhost/img/test.png測試:
"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)
可以看到匹配結果是等號的路徑,所以=號的優先級比^~高
5、總結搜索優先級:
精確匹配 > 字符串匹配( 長 > 短 [ 注: ^~ 匹配則停止匹配 ]) > 正則匹配( 上 > 下 )
使用優先級:
精確匹配 > (^~) > 正則匹配( 上 > 下 )>字符串(長 > 端)
剛學的,如果有錯誤,請指出,我修改,別讓錯誤誤導他人。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39535.html
摘要:改為后,顯示出文件的大概大小,單位是或者或者默認為,顯示的文件時間為時間。 這是 Nginx 學習總結的第三篇,上一篇介紹到了 Nginx 學習總結(2) —— 基本配置,這一篇會對Location 模塊 做一些總結。我們知道,Location 模塊 主要是用于針對某些特定的 URL 進行配置,可以由前綴字符串定義,也可以由正則表達式定義。 Location 匹配規則 location...
摘要:深度學習篇一動靜分離通過中間件將動態請求和靜態請求進行分離。原因分離資源,減少不必要的請求消耗,減少請求延時。關閉后,重定向會失效。驗證規則保持一致。啟動,也會要求你輸入密碼。根據用戶的信息等信息區別根據用戶的地址實現灰度發布示意圖 Nginx-深度學習篇 一、動靜分離 通過中間件將動態請求和靜態請求進行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時。 動態和靜態請求圖例:s...
摘要:深度學習篇一動靜分離通過中間件將動態請求和靜態請求進行分離。原因分離資源,減少不必要的請求消耗,減少請求延時。關閉后,重定向會失效。驗證規則保持一致。啟動,也會要求你輸入密碼。根據用戶的信息等信息區別根據用戶的地址實現灰度發布示意圖 Nginx-深度學習篇 一、動靜分離 通過中間件將動態請求和靜態請求進行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時。 動態和靜態請求圖例:s...
摘要:本文同步在個人博客上,歡迎關注這篇文章整理了在前端開發中,在開發環境下使用重寫及代理功能的方法。表示該規則是使用正則定義的,區分大小寫。因此牢記在上下文中使用,而在上下文中使用。 本文同步在個人博客shymean.com上,歡迎關注 這篇文章整理了在前端開發中,在開發環境下使用nginx重寫uri及代理功能的方法。 參考 nginx中文文檔 前端開發者必備的 Nginx 知識 Ngin...
摘要:以下列配置為例語法規則開頭表示精確匹配開頭表示以某個常規字符串開頭,理解為匹配路徑即可表示區分大小寫的正則匹配表示不區分大小寫的正則匹配和分別為區分大小寫不匹配及不區分大小寫不匹配的正則通用匹配,任何請求都會匹配到。 以下列配置為例 server { listen 80; server_name jouypub.com; location ^~ ...
閱讀 1884·2021-11-17 09:33
閱讀 6470·2021-10-12 10:20
閱讀 2299·2021-09-22 15:50
閱讀 1783·2021-09-22 15:10
閱讀 615·2021-09-10 10:51
閱讀 618·2021-09-10 10:50
閱讀 3020·2021-08-11 11:19
閱讀 1776·2019-08-30 15:55