1、location 介紹
location
是Nginx中的塊級指令(block directive),location指令的功能是用來匹配不同的url請求,進而對請求做不同的處理和響應,這其中較難理解的是多個location的匹配順序,本文會作為重點來解釋和說明。
開始之前先明確一些約定,我們輸入的網址叫做請求URI
,nginx用請求URI與location中配置的URI
做匹配。
2、localtion 語法
location有兩種匹配規則:
-
匹配URL類型,有四種參數可選,當然也可以不帶參數。
location [ = | ~ | ~* | ^~ ] uri { … }
-
命名location,用@標識,類似于定于goto語句塊。
location @name { … }
location匹配參數解釋:
(1)?“=”
?,精確匹配
-
內容要同表達式完全一致才匹配成功
location = /abc/ {.....}# 只匹配http://abc.com/abc
#http://abc.com/abc [匹配成功]
#http://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 這條規則上。
3、location匹配順序
=
?>?^~
?>?~ | ~*
?>?最長前綴匹配
?>?/
序號越小優先級越高
-
location = ? ?# 精準匹配
-
location ^~ ? # 帶參前綴匹配
-
location ~ ? ?# 正則匹配(區分大小寫)
-
location ~* ? # 正則匹配(不區分大小寫)
-
location /a ? # 普通前綴匹配,優先級低于帶參數前綴匹配。
-
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,因為以上規則都不匹配。
4、location URI結尾帶不帶 /
-
如果 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;}}
我們訪問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
}