乾貨 | 一文完全讀懂nginx中的location指令

Nginx系列導讀

給小白的 Nginx 10分鐘入門指南css

Nginx編譯安裝及經常使用命令html

徹底卸載nginx的詳細步驟nginx

Nginx 配置文件詳解web

一文帶你讀懂Nginx反向代理編程

前言

咱們在講解 Nginx 配置文件詳解 中, 把Nginx的主配置文件分紅了三部分,如圖:瀏覽器

今天就帶着你們繼續學習Nginx主配置文件第三部分http塊中的location指令服務器

一、location 介紹

location是Nginx中的塊級指令(block directive),,location指令的功能是用來匹配不一樣的url請求,進而對請求作不一樣的處理和響應,這其中較難理解的是多個location的匹配順序,本文會做爲重點來解釋和說明。微信

開始以前先明確一些約定,咱們輸入的網址叫作請求URI,nginx用請求URI與location中配置的URI作匹配。網絡

二、localtion 語法

location有兩種匹配規則:運維

  • 匹配URL類型,有四種參數可選,固然也能夠不帶參數。

    location [ = | ~ | ~* | ^~ ] uri { … }

  • 命名location,用@標識,相似於定於goto語句塊。

    location @name { … }

location匹配參數解釋:

(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匹配順序

= > ^~ > ~ | ~* > 最長前綴匹配 > /

序號越小優先級越高

  1. location = # 精準匹配
  • = 匹配優先級最高。一旦匹配成功,則再也不查找其餘匹配項。
  1. location ^~ # 帶參前綴匹配
  • ^~類型表達式。一旦匹配成功,則再也不查找其餘匹配項。
  1. location ~ # 正則匹配(區分大小寫)
  2. location ~* # 正則匹配(不區分大小寫)
  3. location /a # 普通前綴匹配,優先級低於帶參數前綴匹配。
  4. location / # 任何沒有匹配成功的,都會匹配這裏處理

舉例

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,由於以上規則都不匹配。 複製代碼

四、location URI結尾帶不帶 /

  1. 若是 URI 結構是 https://domain.com/ 的形式,尾部有沒有 / 都不會形成重定向。由於瀏覽器在發起請求的時候,默認加上了 / 。雖然不少瀏覽器在地址欄裏也不會顯示 / 。這一點,能夠訪問百度驗證一下。

  2. 若是 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的系列書籍,期待與你相遇。

相關文章
相關標籤/搜索