Nginx編譯安裝及經常使用命令html
徹底卸載nginx的詳細步驟nginx
Nginx 配置文件詳解web
咱們在講解 Nginx 配置文件詳解 中, 把Nginx的主配置文件分紅了三部分,如圖:瀏覽器
今天就帶着你們繼續學習Nginx主配置文件第三部分http
塊中的location
指令服務器
location
是Nginx中的塊級指令(block directive),,location指令的功能是用來匹配不一樣的url請求,進而對請求作不一樣的處理和響應,這其中較難理解的是多個location的匹配順序,本文會做爲重點來解釋和說明。微信
開始以前先明確一些約定,咱們輸入的網址叫作請求URI
,nginx用請求URI與location中配置的URI
作匹配。網絡
location有兩種匹配規則:運維
匹配URL類型,有四種參數可選,固然也能夠不帶參數。
location [ = | ~ | ~* | ^~ ] uri { … }
命名location,用@標識,相似於定於goto語句塊。
location @name { … }
(1) 「=」
,精確匹配
location = /abc/ { ..... }只匹配http://abc.com/abc
複製代碼#abc.com/abc [匹配成功] #abc.com/abc/index [匹配失敗] 複製代碼
(2) 「~」
,執行正則匹配,區分大小寫。
location ~ /Abc/ {
.....
}
#http://abc.com/Abc/ [匹配成功]
#http://abc.com/abc/ [匹配失敗]
複製代碼
(3)「~*」
,執行正則匹配,忽略大小寫
location ~* /Abc/ {
.....
}
# 則會忽略 uri 部分的大小寫
#http://abc.com/Abc/ [匹配成功]
#http://abc.com/abc/ [匹配成功]
複製代碼
(4)「^~」
,表示普通字符串匹配上之後再也不進行正則匹配。
location ^~ /index/ {
.....
}
#以 /index/ 開頭的請求,都會匹配上
#http://abc.com/index/index.page [匹配成功]
#http://abc.com/error/error.page [匹配失敗]
複製代碼
(5)不加任何規則時,默認是大小寫敏感,前綴匹配,至關於加了「~」與「^~」
location /index/ { ...... } #http://abc.com/index [匹配成功] #http://abc.com/index/index.page [匹配成功] #http://abc.com/test/index [匹配失敗] #http://abc.com/Index [匹配失敗] # 匹配到全部uri 複製代碼複製代碼
(6)「@」
,nginx內部跳轉
location /index/ {
error_page 404 @index_error;
}
location @index_error {
.....
}
#以 /index/ 開頭的請求,若是連接的狀態爲 404。則會匹配到 @index_error 這條規則上。
複製代碼
=
> ^~
> ~ | ~*
> 最長前綴匹配
> /
location = / { #規則A }location = /login { #規則B }
location ^~ /static/ { #規則C }
location ~ .(gif|jpg|png|js|css)$ { #規則D }
location ~* .png$ { #規則E }
location !~ .xhtml$ { #規則F }
location !~* .xhtml$ { #規則G }
複製代碼location / { #規則H } 複製代碼
匹配結果:
訪問根目錄/, 好比http://localhost/ 將匹配規則A訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
訪問 http://localhost/static/a.html 將匹配規則C
訪問 http://localhost/b.jpg 將匹配規則D和規則E,可是規則D順序優先,規則E不起做用, 而 http://localhost/static/c.png 則優先匹配到 規則C
訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,由於規則E不區分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,由於不區分大小寫。規則F,規則G屬於排除法,符合匹配規則可是不會匹配到。
複製代碼訪問 http://localhost/qll/id/1111 則最終匹配到規則H,由於以上規則都不匹配。 複製代碼
若是 URI 結構是 https://domain.com/ 的形式,尾部有沒有 / 都不會形成重定向。由於瀏覽器在發起請求的時候,默認加上了 / 。雖然不少瀏覽器在地址欄裏也不會顯示 / 。這一點,能夠訪問百度驗證一下。
若是 URI 的結構是 https://domain.com/some-dir/ 。尾部若是缺乏 / 將致使重定向。由於根據約定,URL 尾部的 / 表示目錄,沒有 / 表示文件。因此訪問 /some-dir/ 時,服務器會自動去該目錄下找對應的默認文件。若是訪問 /some-dir 的話,服務器會先去找 some-dir 文件,找不到的話會將 some-dir 當成目錄,重定向到 /some-dir/ ,去該目錄下找默認文件。
舉個例子:
server { listen 9001; server_name www.abc.com;複製代碼location ~ /edu { proxy_pass http://127.0.0.1:8080; } 複製代碼} 複製代碼location ~ /edu { proxy_pass http://127.0.0.1:8080; } 複製代碼
咱們訪問www.abc.com:9001/edu
,看下效果
訪問 /edu 時,服務器首先去找edu文件,找不到則將edu當作目錄,重定向到 /edu/,在該目錄下找默認文件。
可是若是想這兩種請求對應不一樣的處理,就要明確增長不帶/結尾的location配置。例如:
location /doc {
proxy_pass http://www.doc123.com
}
location /doc/ {
proxy_pass http://www.doc456.com
}
複製代碼
歡迎關注微信公衆號『開源Linux
』,專一於分享Linux/Unix相關內容,包括Linux運維、Linux系統開發、網絡編程、以及虛擬化和雲計算等技術乾貨。後臺回覆『學習』,送
你一套學習Linux的系列書籍,期待與你相遇。