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,等號類型要求精確匹配才能命中。