一文詳解nginx中的root與alias
nginx版本: 1.18.0
1. 結(jié)論
location命中后
如果是root,會把請求url的 ip/域名+port
替換為root指定的目錄,訪問資源
如果是alias,會把請求url的ip/域名+port+匹配到的路徑
替換為alias指定的目錄,訪問資源
2. 詳解root
2.1 基本用法
以請求http://example.com/foo/bar/hello.html 為例,location配置如下
location /foo { root /home/hfy/; }
匹配到/foo,url的域名+port
替換為root指定的目錄,即url中的examp.com被替換為了/home/hfy,所以實際訪問的路徑為/home/hfy/foo/bar/hello.html
為了更好理解,再來一個例子,請求的url不變,location配置更改為
location /foo/bar { root /home/hfy/; }
匹配到/foo/bar,url的域名+port
替換為root指定的目錄,即url中的examp.com被替換為了/home/hfy,所以實際訪問的路徑仍然為/home/hfy/foo/bar/hello.html
。root在替換時不會替換匹配到的路徑。
2.2 location的最左匹配原則
location會從url最左邊的路徑匹配,如果一致則命中該location。只有中間匹配到不會命中。
比如請求的url為http://example.com/foo/bar/hello.html ,location為
location /bar { root /home/hfy/; }
不會命中該location,因為從url中的/foo開始匹配,與location /bar
不一致,不會命中,如果url更改為http://example.com/bar/hello.html 才會命中該規(guī)則
2.3 index
在location內(nèi)部其實默認(rèn)配置了一條規(guī)則index index.html
,補全后的規(guī)則如下
location /foo { root /home/hfy/; index index.html; }
假設(shè)我們訪問的url為http://example.com/foo/bar ,匹配到/foo,實際訪問的路徑為/home/hfy/foo/bar。如果我們的bar是一個文件夾,其中如果包含index.html文件,則會把該文件返回。所以index的作用是,當(dāng)實際訪問的是一個目錄時,會返回該目錄中index指定的文件,如果該目錄中不存在index指定的文件,則會返回403。
在訪問http://example.com/foo/bar ,時我們打開瀏覽器的控制臺,查看發(fā)送的請求,會發(fā)現(xiàn)發(fā)生了一個301重定向,http://example.com/foo/bar 被重定向為http://example.com/foo/bar/ ,由此引發(fā)了新的問題,為什么會發(fā)生重定向,url末尾的/,location 匹配路徑末尾的/,以及root 指定目錄末尾的/都表示什么意思
2.4 nginx location解析url工作流程
經(jīng)過我的多次測試,發(fā)現(xiàn)解析url工作流程圖如下
上述的工作流程,假設(shè)了url末尾沒有加/,如果末尾包含/,解析流程為上圖中綠色部分。例如url為http://example.com/foo/ ,如果foo不存在或者是文件,則直接返回404,如果是foo是目錄,則進入到綠色部分流程。如果foo目錄中存在index指定的文件,則返回該文件。如果不存在返回403。從這個例子可以看出,url末尾加/表示要訪問一個目錄,如果實際是個文件,nginx會返回404。
根據(jù)上述的流程圖,我們看一下2.3中的重定向問題,在訪問http://example.com/foo/bar 為什么發(fā)生了301重定向。
首先命中如下規(guī)則
location /foo { root /home/hfy/; index index.html; }
根據(jù)上述的流程圖,先替換域名+port,實際訪問的路徑為/home/hfy/foo/bar,然后nginx發(fā)現(xiàn)bar不是文件而是個目錄(文件夾),所以重定向為了http://example.com/foo/bar/ 訪問bar這個目錄中的index.html文件
2.5 末尾’/’
然后再看一下2.3中的另一個問題,末尾的/分別是什么含義
事先聲明,僅是我個人粗淺的理解,根據(jù)對不同情況的測試,嘗試總結(jié) '/'的含義
- url末尾/的含義
http://example.com/foo/bar 表示我們把bar當(dāng)成一個文件,想要訪問bar文件
http://example.com/foo/bar/ 表示我們把bar當(dāng)成一個目錄,想要訪問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)該是目錄 (不過alias有種特殊情況,后面會提到)
對于這三個斜杠,在實踐中可以有如下使用方案
- url末尾不加/,如果需要帶/時依靠nginx自動幫我們重定向加/
- location 路徑不加/,這樣末尾有無/的url都能匹配到
- root或者alias指定的目錄后面加/,明確表示root指定的是目錄,增強配置的可讀性
3. 詳解alias
3.1 基本用法
以請求http://example.com/foo/bar/hello.html為例,location配置如下
location /foo { alias /home/hfy/; }
匹配到/foo,url的ip/域名+port+匹配到的路徑
替換為alias指定的目錄,即url中的example.com/foo被替換為了/home/hfy,所以實際訪問的路徑為/home/hfy/bar/hello.html
同樣再來一個例子,請求的url不變,如果location配置更改為
location /foo/bar { alias /home/hfy/; }
匹配到/foo/bar,url的ip/域名+port+匹配到的路徑
替換為alias指定的目錄,即url中的example.com/foo/bar被替換為了/home/hfy,所以實際訪問的路徑為/home/hfy/hello.html
。alias在替換時會替換匹配到的路徑。
alias其余特性,最左匹配、index、location解析url工作流程、末尾’/'與root一致。
4. 特殊情況
4.1 alias指定文件
- case 1
url http://example.com/foo
/home/hfy/foo是一個文件
location配置如下
location /foo { alias /home/hfy/foo; }
實際訪問路徑/home/hfy/foo,nginx返回foo文件。
這就是上面說的特例,alias也可以指定文件,并且正常返回了要訪問的文件。但是實際一般不會用alias指定文件。
- case 2
url http://example.com/foo
/home/hfy/foo是一個文件
location配置如下
location /foo { alias /home/hfy/foo/; }
實際訪問路徑/home/hfy/foo,alias指定 /home/hfy/foo/是一個目錄,而foo是一個文件,返回404。
- case 3
url http://example.com/foo/
/home/hfy/foo是一個文件
location配置如下
location /foo/ { alias /home/hfy/foo; }
實際訪問路徑/home/hfy/foo/要訪問目錄,alias指定/home/hfy/foo是目錄或文件,而foo是一個文件,返回了500。
- case 4
url http://example.com/foo/
/home/hfy/foo是一個文件
location配置如下
location /foo/ { alias /home/hfy/foo/; }
實際訪問路徑/home/hfy/foo/,alias指定/home/hfy/foo/是一個目錄,而foo是一個文件,返回了404。
- case 5
url http://example.com/
/home/hfy/foo是一個文件
location配置如下
location / { alias /home/hfy/foo; }
實際訪問路徑/home/hfy/foo,但是返回了500。
- case 6
url http://example.com/
/home/hfy/foo是一個文件
location配置如下
location / { alias /home/hfy/foo/; }
實際訪問路徑/home/hfy/foo,返回404。
4.2 root指定文件
- case 1
url http://example.com/foo
/home/hfy/foo是一個文件
location配置如下
location /foo { root /home/hfy/foo; }
實際訪問路徑/home/hfy/foo/foo,不存在,返回404。
- case 2
url http://example.com/foo
/home/hfy/foo是一個文件
location配置如下
location /foo { root /home/hfy/; }
實際訪問路徑/home/hfy/foo,返回foo文件。
- case 3
url http://example.com/foo/
/home/hfy/foo是一個文件
location配置如下
location /foo { root /home/hfy/; }
或
location配置如下
location /foo/ { root /home/hfy/; }
實際訪問路徑/home/hfy/foo/要訪問目錄,/home/hfy/foo是文件,返回404。
- case 4
url http://example.com/
/home/hfy/foo是一個文件
location配置如下
location / { root /home/hfy/foo; }
實際訪問路徑/home/hfy/foo,foo是一個文件,但是卻返回404。
- case 5
url http://example.com/
/home/hfy/foo是一個文件
location配置如下
location / { root /home/hfy/foo/; }
實際訪問路徑/home/hfy/foo,foo是一個文件,但是卻返回404。
總結(jié)
到此這篇關(guān)于nginx中root與alias的文章就介紹到這了,更多相關(guān)nginx的root與alias內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx配合Apache或Tomcat的動靜分離基本配置實例
這篇文章主要介紹了Nginx配合Apache或Tomcat的動靜分離基本配置實例,實際上Nginx專門負(fù)責(zé)靜態(tài)和反向代理是主流服務(wù)器配置方案,需要的朋友可以參考下2016-01-01在網(wǎng)關(guān)中使用Nginx配置HTTP透明代理案例
這篇文章主要介紹了在網(wǎng)關(guān)中使用Nginx配置HTTP透明代理案例,中間還需要iptables配合,需要的朋友可以參考下2014-06-06Nginx反向代理和內(nèi)容替換模塊實現(xiàn)網(wǎng)頁內(nèi)容動態(tài)替換功能
Nginx是一款輕量級高性能服務(wù)器軟件,雖然輕量,但功能非常強大,可用于提供WEB服務(wù)、反向代理、負(fù)載均衡、緩存服務(wù)、甚至可以通過添加一些模塊搭建rtmp流媒體服務(wù),最近碰到一個客戶需求,需要用到nginx反向代理替換網(wǎng)頁內(nèi)容,貼出來跟大家交流,如有不足之處請指出2024-10-10nginx.conf配置文件結(jié)構(gòu)小結(jié)
本文主要介紹了nginx.conf配置文件結(jié)構(gòu)小結(jié),nginx.conf主要由events、http、server、location、upstream等塊配置項和一些行配置項組成,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04