青蛙學Linux—Nginx配置文件中的location詳解


Nginx配置文件中的location部分主要用來對於傳入的URL進行匹配到特定的location,並從這個location中定義的目錄下查找請求的文件。location部分支持正則。

1、location部分詳解

我們先來看下nginx.conf中原有的兩段location:

location / {
            root   html;
            index  index.html index.htm;
        }

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

關鍵字location后面緊跟的是對於URL的匹配規則,大括號里面的則是這個location的配置,詳解如下:

  • root:定義這個location的查找資源的根目錄,這個目錄可以是相對路徑,也可以是絕對路徑
  • index:定義訪問的默認首頁

在定義location查找資源的目錄時,還可以使用alias指令,它與root的區別如下:

# 假設客戶端訪問的URL為http://xxx/i/123.gif
alias指令將會在其定義的目錄下查找123.gif這個文件
root指令將會在其定義的目錄下的子目錄i中查找123.gif

一般建議在location /中使用root指令來配置根目錄,其他locaiton使用alias指令。

而在第二段配置中,location中使用了proxy_pass這個模塊,proxy_pass模塊一般用於進行反向代理。所以location中不僅可以定義root和index,還可以引用功能模塊。

2、location中的URL匹配部分

預先的定義:假設當前運行Nginx主機的IP地址為192.168.0.110,沒有配置域名解析,僅通過IP地址訪問Nginx。

我們看第一節中的第一個location,匹配的URL規則為/,定義的根目錄為html。也就是說,任何對於http://192.168.0.110的訪問都將會在html目錄下進行資源查找。這里的html目錄就是一個相對目錄,為Nginx安裝目錄下的html目錄。

其實,不僅是對http://192.168.0.110這個主站的訪問,對於http://192.168.0.110站點下的任意資源的訪問都會在html目錄下進行查找。例如:

  • 訪問http://192.168.0.110/1.jpg,此時在主機上對應的目錄文件為html/1.jpg
  • 訪問http://192.168.0.110/test/1.html,此時在主機上對應的目錄文件為html/test/1.html

location在進行URL匹配時支持正則表達式,下面來看兩個location配置:

location ~ .*\.(gif|jpg|png)$ {
    root    /test;
}

我們來分析下location后面的URL匹配部分,~表示區分大小寫匹配;.為正則表達式的符號,表示匹配除\n之外的任意一個字符;*也為正則表達式符號,表示匹配前面的.一次或多次;\為轉義字符,表示將后面的.轉義成正常的.而不是正則表達式符號;(gif|jpg|png)表示匹配gif或jpg或png中的任意一項;$為正則表達式符號,表示匹配以前面的內容結尾。

所以,這條location的含義為,當URL中以.gif|jpg|png結尾時,在/test目錄下查找相應的資源。

location ~ ^/test/ {
    root    /htm;
}

^為正則表達式符號,表示匹配以后面的內容開頭。所以這條location的含義為,當URL中以/test/開頭時,在/htm/test目錄下查找相應的資源。注意:root定義的是根目錄,所以這里對應的主機目錄應該為/htm/test。

3、location中的URL匹配優先級

location支持各種匹配規則,在多個匹配規則下,Nginx對location的處理是有優先級的。

location中的優先級規則為(從上到下優先級依次降低):

  • 等號類型(=),該類型為精確匹配,一旦匹配成功則不再查找其他匹配項
  • 前綴普通匹配(^~),不支持正則表達式;如果有多個location都能匹配的話,優先匹配表達式最長的location
  • 正則表達式匹配,包括~(區分大小寫)和~*(不區分大小寫);正則匹配以從上到下的順序為優先級,一旦匹配一個則不再繼續匹配
  • 常規字符串匹配,如果有多個location都能匹配的話,優先匹配表達式最長的location

一個特殊的location:

location = / {
    root    /test;
}

此時必須使用http://192.168.0.110/才能匹配到該條規則而不是使用http://192.168.0.110,等號類型要求精確匹配才能命中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM