Nginx之location詳解

root

location中root指定的只是相對路徑,需要和路徑結合起來映射地址,比如

location ^~/static/ {	## 這裏的root需要和路徑結合使用,即是映射的文件位置爲 /usr/alyingboy/static
    root /usr/alyingboy/; 
    index index.html
}

此時我們訪問 IP/static/a.css ,那麼就會找到 /usr/alyingboy/static/a.css

alias

alias指定的是絕對路徑,不會和location中的路徑結合使用,而是直接使用地址映射到文件,比如

location ^~/static/ {	## 不會路徑結合映射地址,那麼這裏就會直接映射到/usr/alyingboy/文件夾下的文件
    alias /usr/alyingboy/; 
    index index.html
}

如果定義的路徑是文件夾,那麼需要使用/結尾

一旦配置請求location映射到了指定的位置,那麼下面全部的文件夾和文件都可以映射到,不需要在配置對其的映射,比如 ,但是如果使用其中的文件名重新映射了地址,那麼這個路徑將不能使用

# /usr/alyingboy/文件夾下的全部文件包括子文件夾和文件都可以使用指定的地址訪問到,比如訪問地址爲 :# IP/static/a.txt  ,那麼這個地址訪問的是/usr/alyingboy/static/a.txt文件location / {
    root /usr/alyingboy/;
    index index.html;
}

路徑匹配

  • = 開頭表示精確匹配。如 A 中只匹配根目錄結尾的請求,後面不能帶任何字符串;
  • ^~ 開頭表示uri以某個常規字符串開頭,不是正則匹配;
  • ~ 開頭表示區分大小寫的正則匹配;
  • ~* 開頭表示不區分大小寫的正則匹配;
  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到。

一個location定義可以是一個前綴字符串,也可以是一個正則表達式。正則表達式使用的時候要在前面用“*”修飾符(用於不區分大小寫匹配),或者“”修飾符(用於區分大小寫)。爲了找到請求匹配的location,nginx首先檢查location定義,用前綴字符串(這些location成爲前綴location)。其中,最長匹配前綴的location會被選中並記住。然後,檢查正則表達式,按照它們在配置文件中出現的順序。對正則表達式的搜索在第一次匹配時終止,並使用相應的配置。如果沒有找到與正則表達式的匹配,則使用前面記住的前綴位置的配置。

1、用前綴字符串(前綴location)匹配URL,並且選中並記住最長匹配前綴的location(注意:是在匹配的裏面記住最長的那個)

2、按照正則表達式在配置文件中出現的順序依次去匹配,當匹配到第一個以後立即停止,並使用與之相應的那個location。如果沒有一個正則表達式匹配,則使用之前記住的那個前綴location。

以上,我們可以得出一個結論:優先使用正則表達式,如果沒有匹配的正則表達式發現,則使用匹配的最長前綴字符串location

location  = / {
  # 精確匹配 / ,主機名後面不能帶任何字符串
  [ configuration A ]
}location  / {
  # 因爲所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
  # 但是正則和最長字符串會優先匹配
  [ configuration B ]
}location /documents/ {  # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索
  # 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條
  [ configuration C ]
}location ~ /documents/Abc {  # 匹配任何以 /documents/Abc 開頭的地址,匹配符合以後,還要繼續往下搜索
  # 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條
  [ configuration CC ]
}location ^~ /images/ {  # 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜索正則,採用這一條。
  [ configuration D ]
}location ~* \.(gif|jpg|jpeg)$ {  # 匹配所有以 gif,jpg或jpeg 結尾的請求
  # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因爲 ^~ 到達不了這一條正則
  [ configuration E ]
}location /images/ {  # 字符匹配到 /images/,繼續往下,會發現 ^~ 存在
  [ configuration F ]
}location /images/abc {  # 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在
  # F與G的放置順序是沒有關係的
  [ configuration G ]
}location ~ /images/abc/ {  # 只有去掉 config D 纔有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,採用
  # 因爲都是正則匹配,優先級一樣,選擇最上面的
    [ configuration H ]
}location ~* /js/.*/\.js

優先級

( location = ) > ( location 完整路徑 ) > ( location ^~ 路徑 ) > ( location ,* 正則順序 ) > ( location 部分起始路徑 ) > ( / )

推薦使用

#直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。#這裏是直接轉發給後端應用服務器了,也可以是一個靜態首頁# 第一個必選規則location = / {
    proxy_pass http://tomcat:8080/index
}# 第二個必選規則是處理靜態文件請求,這是nginx作爲http服務器的強項# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用location ^~ /static/ {
    root /webroot/static/;
}location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}#第三個規則就是通用規則,用來轉發動態請求到後端應用服務器#非靜態文件請求就默認是動態請求,自己根據實際把握#畢竟目前的一些框架的流行,帶.php,.jsp後綴的情況很少了location / {
    proxy_pass http://tomcat:8080/
}

proxy_pass

在nginx中配置proxy_pass代理轉發時,如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走。

假設下面四種情況分別用 http://192.168.1.1/proxy/test.html 進行訪問。

第一種:location /proxy/ {
    proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html

第二種(相對於第一種,最後少一個 / )
location /proxy/ {
    proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html

第三種:location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html

第四種(相對於第三種,最後少一個 / )
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html

參考鏈接:

Nginx之location詳解 :https://mp.weixin.qq.com/s/d9Kh-7CQhMIhEpcaZ3Em_A

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章