1. <em id="vzzs9"></em>
      <tbody id="vzzs9"></tbody>

    2. <span id="vzzs9"></span>
      <progress id="vzzs9"></progress>
      首頁 運維雜談一份簡單夠用的 Nginx Location 配置講解

      一份簡單夠用的 Nginx Location 配置講解

      運維派隸屬馬哥教育旗下專業運維社區,是國內成立最早的IT運維技術社區,歡迎關注公眾號:yunweipai
      領取學習更多免費Linux云計算、Python、Docker、K8s教程關注公眾號:馬哥linux運維

      前言

      Location 是 Nginx 中一個非常核心的配置,這篇重點講解一下 Location 的配置問題以及一些注意事項。

      語法

      關于 Location,舉個簡單的配置例子:

      http {   
        server {  
            listen 80;  
              server_name www.yayujs.com;  
              location / {  
                root /home/www/ts/;  
                index index.html;  
              }  
        }  
      }  
      

      大致的意思是,當你訪問 www.yayujs.com 的 80 端口的時候,返回 /home/www/ts/index.html 文件。

      我們看下 Location 的具體語法:

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

      重點看方括號中的 [ = | ~ | ~* | ^~ ],其中 | 分隔的內容表示你可能會用到的語法,其中:

      • = 表示精確匹配,比如:
      location = /test {  
        return 200 "hello";  
      }  
      
      # /test ok  
      # /test/ not ok  
      # /test2 not ok  
      # /test/2 not ok  
      
      *   ~ 表示區分大小寫的正則匹配,比如:
      
      ```bash
      location ~ ^/test$ {  
        [ configuration ]   
      }  
      
      # /test ok  
      # /Test not ok  
      # /test/ not ok  
      # /test2 not ok
      
      • ~* 表示不區分大小寫的正則匹配
      location ~* ^/test$ {       
          [ configuration ]   
      }  
      
      # /test ok  
      # /Test ok  
      # /test/ not ok  
      # /test2 not ok  
      
      • ^~ 表示 uri 以某個字符串開頭
      location ^~ /images/ {      
          [ configuration ]   
      }  
      
      # /images/1.gif ok  
      

      而當你不使用這些語法的時候,只寫 uri 的時候:

      / 表示通用匹配:

      location / {       
          [ configuration ]   
      }  
      
      # /index.html ok  
      
      location /test {  
          [ configuration ]   
      }  
      
      # /test ok  
      # /test2 ok  
      # /test/ ok  
      

      匹配順序

      當存在多個 location 的時候,他們的匹配順序引用 Nginx 官方文檔就是:
      一份簡單夠用的 Nginx Location 配置講解插圖

      翻譯整理后就是:

      location 的定義分為兩種:

      • 前綴字符串(prefix string)
      • 正則表達式(regular expression),具體為前面帶 ~* 和 ~ 修飾符的

      而匹配 location 的順序為:

      1. 檢查使用前綴字符串的 locations,在使用前綴字符串的 locations 中選擇最長匹配的,并將結果進行儲存
      2. 如果符合帶有 = 修飾符的 URI,則立刻停止匹配
      3. 如果符合帶有 ^~ 修飾符的 URI,則也立刻停止匹配。
      4. 然后按照定義文件的順序,檢查正則表達式,匹配到就停止
      5. 當正則表達式匹配不到的時候,使用之前儲存的前綴字符串

      再總結一下就是:

      在順序上,前綴字符串順序不重要,按照匹配長度來確定,正則表達式則按照定義順序。

      在優先級上,= 修飾符最高,^~ 次之,再者是正則,最后是前綴字符串匹配。

      我們舉幾個簡單的例子復習下:

      server {  
          location /doc {  
              [ configuration A ]   
          }  
          location /docu {  
              [ configuration B ]   
          }  
      }  
      
      # 請求 /document 使用 configuration B  
      # 雖然 /doc 也能匹配到,但在順序上,前綴字符串順序不重要,按照匹配長度來確定  
      
      
      server {  
      
          location ~ ^/doc {  
              [ configuration A ]   
          }  
          location ~ ^/docu {  
              [ configuration B ]   
          }  
      }  
      
      # 請求 /document 使用 configuration A  
      # 雖然 ~ ^/docu 也能匹配到,但正則表達式則按照定義順序
      
      server {  
          location ^~ /doc {  
              [ configuration A ]   
          }  
          location ~ ^/docu {  
              [ configuration B ]   
          }  
      }  
      
      # 請求 /document 使用 configuration A  
      # 雖然 ~ ^/docu 也能匹配到,但 ^~ 的優先級更高  
      
      server {  
          location /document {  
              [ configuration A ]   
          }  
          location ~ ^/docu {  
              [ configuration B ]   
          }  
      }  
      
      # 請求 /document 使用 configuration B  
      # 雖然 /document 也能匹配到,但正則的優先級更高  
      

      root 與 alias 的區別

      當我們這樣設置 root 的時候:

      location /i/ {  
          root /data/w3;  
      }  
      

      當請求 /i/top.gif ,/data/w3/i/top.gif 會被返回。

      當我們這樣設置 alias 的時候:

      location /i/ {  
          alias /data/w3/images/;  
      }  
      

      當請求 /i/top.gif ,/data/w3/images/top.gif 會被返回。

      乍一看兩者很像,但細一看,就能看出兩者的區別,root 是直接拼接 root + location 而 alias 是用 alias 替換 location,所以 root 中最后的路徑里有 /i/,而 alias 中最后的路徑里沒有 /i/ 。

      所以如果你這樣使用 allias 定義一個路徑:

      location /images/ {  
          alias /data/w3/images/;  
      }  
      

      其實使用 root 會更好:

      location /images/ {  
          root /data/w3;  
      }  
      

      server 和 location 中的 root

      server 和 location 中都可以使用 root,舉個例子:

      http {   
        server {  
            listen 80;  
              server_name www.yayujs.com;  
              root /home/www/website/;  
              location / {  
                root /home/www/ts/;  
                index index.html;  
              }  
        }  
      }  
      

      如果兩者都出現,是怎樣的優先級呢?

      簡單的來說,就是就近原則,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,當 location 中匹配不到的時候,則使用 server 中的 root 配置。

      作者:冴羽
      (版權歸原作者所有,侵刪)

      本文鏈接:http://www.abandonstatusquo.com/40863.html

      網友評論comments

      發表評論

      您的電子郵箱地址不會被公開。

      暫無評論

      Copyright ? 2012-2022 YUNWEIPAI.COM - 運維派 京ICP備16064699號-6
      掃二維碼
      掃二維碼
      返回頂部
      久久久久亚洲国内精品|亚洲一区二区在线观看综合无码|欧洲一区无码精品色|97伊人久久超碰|一级a爱片国产亚洲精品