一文詳解nginx中的root與alias
nginx版本: 1.18.0
1. 結(jié)論
location命中后
如果是root,會(huì)把請(qǐng)求url的 ip/域名+port替換為root指定的目錄,訪問(wèn)資源
如果是alias,會(huì)把請(qǐng)求url的ip/域名+port+匹配到的路徑替換為alias指定的目錄,訪問(wèn)資源
2. 詳解root
2.1 基本用法
以請(qǐng)求http://example.com/foo/bar/hello.html 為例,location配置如下
location /foo {
root /home/hfy/;
}
匹配到/foo,url的域名+port替換為root指定的目錄,即url中的examp.com被替換為了/home/hfy,所以實(shí)際訪問(wèn)的路徑為/home/hfy/foo/bar/hello.html
為了更好理解,再來(lái)一個(gè)例子,請(qǐng)求的url不變,location配置更改為
location /foo/bar {
root /home/hfy/;
}
匹配到/foo/bar,url的域名+port替換為root指定的目錄,即url中的examp.com被替換為了/home/hfy,所以實(shí)際訪問(wèn)的路徑仍然為/home/hfy/foo/bar/hello.html。root在替換時(shí)不會(huì)替換匹配到的路徑。
2.2 location的最左匹配原則
location會(huì)從url最左邊的路徑匹配,如果一致則命中該location。只有中間匹配到不會(huì)命中。
比如請(qǐng)求的url為http://example.com/foo/bar/hello.html ,location為
location /bar {
root /home/hfy/;
}
不會(huì)命中該location,因?yàn)閺膗rl中的/foo開(kāi)始匹配,與location /bar不一致,不會(huì)命中,如果url更改為http://example.com/bar/hello.html 才會(huì)命中該規(guī)則
2.3 index
在location內(nèi)部其實(shí)默認(rèn)配置了一條規(guī)則index index.html,補(bǔ)全后的規(guī)則如下
location /foo {
root /home/hfy/;
index index.html;
}
假設(shè)我們?cè)L問(wèn)的url為http://example.com/foo/bar ,匹配到/foo,實(shí)際訪問(wèn)的路徑為/home/hfy/foo/bar。如果我們的bar是一個(gè)文件夾,其中如果包含index.html文件,則會(huì)把該文件返回。所以index的作用是,當(dāng)實(shí)際訪問(wèn)的是一個(gè)目錄時(shí),會(huì)返回該目錄中index指定的文件,如果該目錄中不存在index指定的文件,則會(huì)返回403。
在訪問(wèn)http://example.com/foo/bar ,時(shí)我們打開(kāi)瀏覽器的控制臺(tái),查看發(fā)送的請(qǐng)求,會(huì)發(fā)現(xiàn)發(fā)生了一個(gè)301重定向,http://example.com/foo/bar 被重定向?yàn)閔ttp://example.com/foo/bar/ ,由此引發(fā)了新的問(wèn)題,為什么會(huì)發(fā)生重定向,url末尾的/,location 匹配路徑末尾的/,以及root 指定目錄末尾的/都表示什么意思
2.4 nginx location解析url工作流程
經(jīng)過(guò)我的多次測(cè)試,發(fā)現(xiàn)解析url工作流程圖如下

上述的工作流程,假設(shè)了url末尾沒(méi)有加/,如果末尾包含/,解析流程為上圖中綠色部分。例如url為http://example.com/foo/ ,如果foo不存在或者是文件,則直接返回404,如果是foo是目錄,則進(jìn)入到綠色部分流程。如果foo目錄中存在index指定的文件,則返回該文件。如果不存在返回403。從這個(gè)例子可以看出,url末尾加/表示要訪問(wèn)一個(gè)目錄,如果實(shí)際是個(gè)文件,nginx會(huì)返回404。
根據(jù)上述的流程圖,我們看一下2.3中的重定向問(wèn)題,在訪問(wèn)http://example.com/foo/bar 為什么發(fā)生了301重定向。
首先命中如下規(guī)則
location /foo {
root /home/hfy/;
index index.html;
}
根據(jù)上述的流程圖,先替換域名+port,實(shí)際訪問(wèn)的路徑為/home/hfy/foo/bar,然后nginx發(fā)現(xiàn)bar不是文件而是個(gè)目錄(文件夾),所以重定向?yàn)榱薶ttp://example.com/foo/bar/ 訪問(wèn)bar這個(gè)目錄中的index.html文件
2.5 末尾’/’
然后再看一下2.3中的另一個(gè)問(wèn)題,末尾的/分別是什么含義
事先聲明,僅是我個(gè)人粗淺的理解,根據(jù)對(duì)不同情況的測(cè)試,嘗試總結(jié) '/'的含義
- url末尾/的含義
http://example.com/foo/bar 表示我們把bar當(dāng)成一個(gè)文件,想要訪問(wèn)bar文件
http://example.com/foo/bar/ 表示我們把bar當(dāng)成一個(gè)目錄,想要訪問(wèn)bar目錄下index指定的文件
- location 匹配路徑末尾/的含義
location /foo {
root /home/hfy/;
index index.html;
}
/foo 既能匹配http://example.com/foo 也能匹配 http://example.com/foo/
location /foo/ {
root /home/hfy/;
index index.html;
}
/foo/只能匹配http://example.com/foo/
- root 指定目錄末尾/的含義
location /foo {
root /home/hfy/;
index index.html;
}
/home/hfy 表示把hfy當(dāng)成目錄或者文件
/home/hfy/ 表示只把hfy當(dāng)成目錄
root后面指定的都應(yīng)該是目錄 (不過(guò)alias有種特殊情況,后面會(huì)提到)
對(duì)于這三個(gè)斜杠,在實(shí)踐中可以有如下使用方案
- url末尾不加/,如果需要帶/時(shí)依靠nginx自動(dòng)幫我們重定向加/
- location 路徑不加/,這樣末尾有無(wú)/的url都能匹配到
- root或者alias指定的目錄后面加/,明確表示root指定的是目錄,增強(qiáng)配置的可讀性
3. 詳解alias
3.1 基本用法
以請(qǐng)求http://example.com/foo/bar/hello.html為例,location配置如下
location /foo {
alias /home/hfy/;
}
匹配到/foo,url的ip/域名+port+匹配到的路徑替換為alias指定的目錄,即url中的example.com/foo被替換為了/home/hfy,所以實(shí)際訪問(wèn)的路徑為/home/hfy/bar/hello.html
同樣再來(lái)一個(gè)例子,請(qǐng)求的url不變,如果location配置更改為
location /foo/bar {
alias /home/hfy/;
}
匹配到/foo/bar,url的ip/域名+port+匹配到的路徑替換為alias指定的目錄,即url中的example.com/foo/bar被替換為了/home/hfy,所以實(shí)際訪問(wèn)的路徑為/home/hfy/hello.html。alias在替換時(shí)會(huì)替換匹配到的路徑。
alias其余特性,最左匹配、index、location解析url工作流程、末尾’/'與root一致。
4. 特殊情況
4.1 alias指定文件
- case 1
url http://example.com/foo
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo {
alias /home/hfy/foo;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,nginx返回foo文件。
這就是上面說(shuō)的特例,alias也可以指定文件,并且正常返回了要訪問(wèn)的文件。但是實(shí)際一般不會(huì)用alias指定文件。
- case 2
url http://example.com/foo
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo {
alias /home/hfy/foo/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,alias指定 /home/hfy/foo/是一個(gè)目錄,而foo是一個(gè)文件,返回404。
- case 3
url http://example.com/foo/
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo/ {
alias /home/hfy/foo;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo/要訪問(wèn)目錄,alias指定/home/hfy/foo是目錄或文件,而foo是一個(gè)文件,返回了500。
- case 4
url http://example.com/foo/
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo/ {
alias /home/hfy/foo/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo/,alias指定/home/hfy/foo/是一個(gè)目錄,而foo是一個(gè)文件,返回了404。
- case 5
url http://example.com/
/home/hfy/foo是一個(gè)文件
location配置如下
location / {
alias /home/hfy/foo;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,但是返回了500。
- case 6
url http://example.com/
/home/hfy/foo是一個(gè)文件
location配置如下
location / {
alias /home/hfy/foo/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,返回404。
4.2 root指定文件
- case 1
url http://example.com/foo
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo {
root /home/hfy/foo;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo/foo,不存在,返回404。
- case 2
url http://example.com/foo
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo {
root /home/hfy/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,返回foo文件。
- case 3
url http://example.com/foo/
/home/hfy/foo是一個(gè)文件
location配置如下
location /foo {
root /home/hfy/;
}
或
location配置如下
location /foo/ {
root /home/hfy/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo/要訪問(wèn)目錄,/home/hfy/foo是文件,返回404。
- case 4
url http://example.com/
/home/hfy/foo是一個(gè)文件
location配置如下
location / {
root /home/hfy/foo;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,foo是一個(gè)文件,但是卻返回404。
- case 5
url http://example.com/
/home/hfy/foo是一個(gè)文件
location配置如下
location / {
root /home/hfy/foo/;
}
實(shí)際訪問(wèn)路徑/home/hfy/foo,foo是一個(gè)文件,但是卻返回404。
總結(jié)
到此這篇關(guān)于nginx中root與alias的文章就介紹到這了,更多相關(guān)nginx的root與alias內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx日志中request_time和upstream_response_time區(qū)別
Nginx日志中的request_time和upstream_response_time是關(guān)鍵的性能指標(biāo),本文就來(lái)介紹一下Nginx日志中request_time和upstream_response_time區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-11-11
nginx實(shí)現(xiàn)靜態(tài)文件的token認(rèn)證過(guò)程
這篇文章主要介紹了nginx實(shí)現(xiàn)靜態(tài)文件的token認(rèn)證過(guò)程,2024-06-06
nginx配置proxy_pass代理轉(zhuǎn)發(fā)時(shí)報(bào)404問(wèn)題
這篇文章主要介紹了nginx配置proxy_pass代理轉(zhuǎn)發(fā)時(shí)報(bào)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例
這篇文章主要介紹了Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例,本文講解了正則表達(dá)式匹配、文件及目錄匹配、flag標(biāo)記、Nginx Rewrite相關(guān)指令等內(nèi)容,需要的朋友可以參考下2015-01-01
Nginx虛擬主機(jī)的搭建的實(shí)現(xiàn)步驟
本文主要介紹了Nginx虛擬主機(jī)的搭建的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
nginx設(shè)置資源緩存實(shí)戰(zhàn)詳解
這篇文章主要介紹了nginx設(shè)置資源緩存實(shí)戰(zhàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
在Nginx中實(shí)現(xiàn)動(dòng)態(tài)封禁IP的三種主流方案
在運(yùn)維和安全實(shí)踐中,經(jīng)常需要根據(jù)實(shí)時(shí)情況封禁某些惡意 IP,但傳統(tǒng)的Nginx 配置是靜態(tài)的,一旦寫(xiě)死deny 1.2.3.4;,就必須重啟或重載服務(wù)才能生效,那么,有沒(méi)有辦法實(shí)現(xiàn)動(dòng)態(tài)、實(shí)時(shí)、可編程的IP封禁呢,所以本文給大家介紹了在Nginx中實(shí)現(xiàn)動(dòng)態(tài)封禁IP的三種主流方案2025-11-11
nginx通過(guò)https部署vue項(xiàng)目的完整步驟
在實(shí)際開(kāi)發(fā)中,我們會(huì)以https形式進(jìn)行頁(yè)面訪問(wèn),下面這篇文章主要給大家介紹了關(guān)于nginx通過(guò)https部署vue項(xiàng)目的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Nginx 操作響應(yīng)頭信息的實(shí)現(xiàn)
這篇文章主要介紹了Nginx 操作響應(yīng)頭信息的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

