Nginx學(xué)習(xí):HTTP核心模塊(三)Location
Location 是整個(gè) HTTP 模塊中非常重要的一個(gè)子模塊,它是為某個(gè)請(qǐng)求URI(路徑)建立配置。這個(gè)模塊又是屬于 Server 模塊的子模塊,同時(shí)它還可以嵌套在另一個(gè) Location 模塊下面,因此,它的作用范圍是 server 和 location 。其實(shí),說白了,也就是我們可以為指定的一些路徑去做一些額外的配置。
location?[?=?|?~?|?~*?|?^~?]?uri?{?...?}
看著就復(fù)雜吧?最主要的就是 [] 中的選項(xiàng),因?yàn)樗梢杂卸喾N匹配模式。不過我們先講一下不配置 Location 是什么情況。
如果我們不配置 Location ,那么根據(jù)請(qǐng)求中的 URL 的 Path 部分,比如:/,它就會(huì)找到 root 指定的目錄下的 index 配置指定的文件,比如 index.html ,如果找不到文件,就返回 404 。
假如我們?cè)跒g覽器客戶端指定了訪問路徑,比如 /aaa/aaa.html ,那么就是找 root 指定的目錄下的 aaa 目錄下的 aaa.html 文件。比如在我這里就是 /usr/local/nginx/html/aaa/ 這個(gè)目錄下的 aaa.html 文件。
這就是默認(rèn)的,最正常的一個(gè) Nginx 中 Server 的訪問形式。
而 Location 的作用,就是能夠讓我們?cè)L問 /aaa/aaa.html 時(shí),可以讓他不直接打開 aaa.html ,或者在打開 aaa.html 的時(shí)候再做一些別的操作。比如我們先簡(jiǎn)單配一個(gè),就用這個(gè) /aaa/aaa.html 。
默認(rèn)不配的情況下,我們 root 指定的目錄 /aaa 并不存在,更沒有下面的 aaa.html 文件,所以它會(huì)直接返回 404 ?,F(xiàn)在我們就簡(jiǎn)單配置一個(gè)。
location?/aaa/aaa.html?{
????try_files?''?/index.html;
}
現(xiàn)在你再重載一下配置文件,然后訪問試試,看看是不是訪問這個(gè)路徑,它把首頁(yè)打開了??梢哉f,這玩意就是整個(gè) Nginx 的靈魂,或者說,所有的服務(wù)器應(yīng)用中,類似的操作 URI 及訪問路徑的功能,都是靈魂,是服務(wù)器類型應(yīng)用中最重要的部分之一。
匹配規(guī)則
路徑匹配會(huì)在 URI 規(guī)范化以后進(jìn)行。所謂規(guī)范化,就是先將 URI 中形如 “%XX” 的編碼字符進(jìn)行解碼, 再解析 URI 中的相對(duì)路徑 “.” 和 “..” 部分, 另外還可能會(huì)壓縮相鄰的兩個(gè)或多個(gè)斜線成為一個(gè)斜線。
可以使用前綴字符串或者正則表達(dá)式定義路徑。使用正則表達(dá)式需要在路徑開始添加 “~*” 前綴 (不區(qū)分大小寫),或者 “~” 前綴(區(qū)分大小寫)。為了根據(jù)請(qǐng)求 URI 查找路徑,Nginx 先檢查前綴字符串定義的路徑 (前綴路徑),在這些路徑中找到能最精確匹配請(qǐng)求 URI 的路徑。然后 Nginx 按在配置文件中的出現(xiàn)順序檢查正則表達(dá)式路徑, 匹配上某個(gè)路徑后即停止匹配并使用該路徑的配置,否則使用最大前綴匹配的路徑的配置。
路徑可以嵌套,但有例外,后面將提到。
在不區(qū)分大小寫的操作系統(tǒng)(諸如Mac OS X和Cygwin)上,前綴匹配忽略大小寫 (0.7.7) 。但是,比較僅限于單字節(jié)的編碼區(qū)域(one-byte locale)。
正則表達(dá)式中可以包含匹配組 (0.7.40) ,結(jié)果可以被后面的其他指令使用。
如果最大前綴匹配的路徑以 “^~” 開始,那么 Nginx 不再檢查正則表達(dá)式。
而且,使用“=”前綴可以定義URI和路徑的精確匹配。如果發(fā)現(xiàn)匹配,則終止路徑查找。比如,如果請(qǐng)求 “/” 出現(xiàn)頻繁,定義“l(fā)ocation = /”可以提高這些請(qǐng)求的處理速度, 因?yàn)椴檎疫^程在第一次比較以后即結(jié)束。這樣的路徑明顯不可能包含嵌套路徑。
在 0.7.1 到 0.8.41 的所有nginx版本中,如果請(qǐng)求匹配的前綴字符串路徑并沒有 “=” 或 “^~” 前綴, 路徑查找過程仍然會(huì)停止,而不進(jìn)行正則表達(dá)式匹配。
沒錯(cuò),上面全是官方文檔中的說明。能堅(jiān)持看完吧?看不完咱們就來(lái)一個(gè)一個(gè)的試。
普通匹配與精確匹配
先試試最簡(jiǎn)單的,也是我們最常見的,那就是啥都不加的,以及加上一個(gè) = 號(hào)進(jìn)行精確匹配的。
location?/?{
?return?200?201;
}
location?=?/?{
?return?200?202;
}
location?/zyblog?{
?return?200?203;
}
location?=?/zyblog?{
?return?200?204;
}
location?/zyblog/?{
?return?200?205;
}
不同的 URI 給了不同的狀態(tài)碼返回,便于我們測(cè)試。
直接訪問 http://192.168.56.88 或者 http://192.168.56.88/ ,都會(huì)進(jìn)入 202 ,這里是 = 號(hào)在起作用,定位到精確匹配。訪問 http://192.168.56.88/index.html ,或者 http://192.168.56.88/xxx (xxx 表示任意其它字符)都會(huì)進(jìn)入 201 。其實(shí) = 號(hào)的意思就是,只要訪問的 URI 和我這里是完全對(duì)應(yīng)的,就不進(jìn)行其它匹配了,直接走當(dāng)前這個(gè) location 下面的內(nèi)容。
普通匹配遵循的是前綴匹配法,這里會(huì)比較復(fù)雜,我們列表看一下。
我們定義了 /zyblog 和 /zyblog/ ,注意這是兩種不同的情況
訪問 /zyblog 進(jìn)入到 204 中,訪問 /zyblog/ 進(jìn)入 205
如果我們?cè)L問 /zyblogaaa 就會(huì)進(jìn)入到 203 的配置中
訪問 /zyblog/1.html 進(jìn)入的是 205
訪問 /zyblogaaa/1.html 進(jìn)入的是203
如果訪問一個(gè)沒有配置的 /new 這樣的路徑,則全部是進(jìn)入到 / 這個(gè) 201 的配置中
如果注釋掉 /zyblog/ 的配置,我們?cè)贉y(cè)試訪問 /zyblog、/zyblog/ ,這時(shí)你會(huì)發(fā)現(xiàn),結(jié)尾帶 / 的,走的是 203 ,而不帶 / 的走的是 204 ?,F(xiàn)在將 = 號(hào)對(duì)應(yīng)的 /zyblog 修改為 /zyblog/ ,那么上面的測(cè)試結(jié)果又會(huì)反過來(lái)。這里在平常進(jìn)行配置的時(shí)候一定要注意,非常容易繞暈。
總結(jié)一下,普通匹配中,如果結(jié)尾沒有 / ,是類似于正則中 /zyblog* 的意思,如果有 / 則是 /zyblog/* 的意思。而 = 號(hào)是完全匹配,和等號(hào)后面完全一樣的才可以。
正則匹配
正則匹配就是可以使用正則表達(dá)式來(lái)進(jìn)行復(fù)雜的 URI 定義的匹配。
location?~*?\.(mp4|avi|gif)$?{
??return?200?205;
}
location?~?\.(jpg|JPEG|gif)$?{
?return?200?206;
}
上面的兩個(gè)例子中,~* 表示忽略大小寫,~ 表示區(qū)分大小寫。我們可以直接這樣來(lái)測(cè)試,http://192.168.56.88/1.mp4 和 http://192.168.56.88/1.MP4 都是走的 205 ,http://192.168.56.88/1.JPEG 走的是 206 ,但 http://192.168.56.88/1.jpeg 則會(huì)走 201 ,因?yàn)榇笮憶]匹配到 206。
最后那個(gè)?$ 符號(hào)表示要以指定正則的內(nèi)容結(jié)尾,比如我們現(xiàn)在嘗試 http://192.168.56.88/1.mp4/123123,返回的是201,去掉符號(hào)之后,再次請(qǐng)求,返回的就是 205 了。除此之外,還有一個(gè) ^ ,表示要以正則里的內(nèi)容開頭,其實(shí)這兩個(gè)符號(hào)和普通的正則規(guī)則都是一樣的。
location?~?^/a(.*)\.(flv|mp5)$?{
???return?200?207$1$2;
}
像上面這個(gè)配置,就只有 a 開頭,以 flv 或 mp5 結(jié)尾的可以匹配到,其它 URI 都不會(huì)匹配到這個(gè) location 。注意,~ 和 ^ ,$ 和 { 之間都要有空格的哦。另外這個(gè) 207 的返回值我們還加上了一個(gè)?$1$2,其實(shí)取得就是正則中每一個(gè)括號(hào)的里面的值。
最后,還有一點(diǎn),正則是按先后順序匹配的,在上面的兩個(gè)正則條件中,都有 gif 這個(gè)條件,當(dāng)我們?cè)L問 http://192.168.56.88/1.gif 時(shí),會(huì)走哪個(gè)呢?很明顯,它會(huì)走第一個(gè) 205 ,正則和正則之間的優(yōu)先級(jí)按配置文件中的順序確定。
非正則
非正則匹配使用的是 ^~ ,啥意思呢?
location?^~?/r?{
?return?200?208;
}
location?~?\.(txt)?{
?return?200?209;
}
location?/r/3.txt?{
??return?200?209;
}
location?=?/r/2.txt?{
?return?200?210;
}
其實(shí)呀,就是只要是訪問 /r 目錄下的內(nèi)容,都會(huì)返回 208 ,不會(huì)走后面的其它正則匹配了(可以嘗試去掉 ^~ 會(huì)發(fā)現(xiàn)會(huì)走后面.txt的正則匹配)?,F(xiàn)在你可以訪問 http://192.168.56.88/r/ 、http://192.168.56.88/r、http://192.168.56.88/r/1.jpg ,返回的都是 208 。即使 1.jpg 其實(shí)是匹配到了正則中的那個(gè) jpg 相關(guān)的配置,但還是會(huì)走 ^~ 的配置。除非,在它底下再使用 普通規(guī)則 或者 精確規(guī)則 。http://192.168.56.88/r/3.txt 會(huì)返回 209 ,http://192.168.56.88/r/2.txt 會(huì)返回 210 。
匹配優(yōu)先級(jí)
從上面的學(xué)習(xí)中,我們其實(shí)可以看出,幾種不同的匹配規(guī)則的優(yōu)先級(jí)順序。
= 號(hào)精確匹配是絕對(duì)的 No.1 ,但是靈活性也最低
^~ 非正則最大前綴是其次,前兩個(gè)匹配規(guī)則會(huì)減少匹配次數(shù),不會(huì)繼續(xù)向下匹配
正則優(yōu)先級(jí)老三,它的靈活性是最高的,同樣的正則匹配,還要看正則匹配的前后順序(比如上面測(cè)試的 gif 那個(gè))
不帶任何符號(hào)的普通規(guī)則優(yōu)先級(jí)最低
沒有任何匹配成功的,都會(huì)到?
location /
?下面進(jìn)行最終的處理
除了優(yōu)先級(jí)之外,還有個(gè)匹配順序的問題,比如說面試的時(shí)候給出上面的一堆配置,然后問這些問題:
訪問 /zyblog/aa/1.jpg ,返回的會(huì)是哪個(gè)呢?是 206
而如果是 /zyblog/aa/1.txt 呢?返回的是 209
直接 /zyblog/1.txt 呢?同樣還是 209
/zyblog/aa 呢?203
/zyblog/r/ 還是 203
/r/zyblog/ 會(huì)是多少呢?208
暈頭轉(zhuǎn)向吧?那就對(duì)了,這東西就是容易讓人暈頭轉(zhuǎn)向,重點(diǎn)還是把握住上面的優(yōu)先級(jí)規(guī)則,另外,在現(xiàn)實(shí)的生產(chǎn)環(huán)境中,盡量別配太復(fù)雜的正則,懂得都懂。在進(jìn)行配置的時(shí)候,本地或者測(cè)試機(jī)多測(cè)試一下才是王道。
嵌套
location 是可以嵌套在另一個(gè) location 中的。
location??/zy?{
??location?/zy/bar?{
????location?/zy/bar/baz?{
?????return?200?211;
????}
???return?200?212;
??}
?return?200?213;
}
有點(diǎn)亂吧,不過應(yīng)該也比較清晰,/zy/xxx、/zy/bar/xxx 會(huì)返回 213 和 212 ,而 /zy/bar/baz 及這個(gè) URI 下面的所有內(nèi)容會(huì)返回 211 ,/zy/bar 會(huì)返回 212 。它們?nèi)齻€(gè)層級(jí)組成了三層嵌套的關(guān)系。
@符號(hào)
這個(gè) @ 符號(hào),表示一個(gè)命名路徑,有這個(gè)符號(hào)的 location 不參與路徑解析。
location?@cc?{
??return?200?214;
}
location?/test/at?{
??try_files?$uri?@cc;
}
比如上面的配置,我們直接訪問 /cc 是沒有效果的,而訪問 /test/at 才會(huì)返回 214 的內(nèi)容,也就是說,@ 符號(hào)定義的 location 是需要配合 try_files 這類的指令進(jìn)行操作的??梢援?dāng)做內(nèi)部使用的一些預(yù)備命名路徑。
結(jié)尾 / 問題
location 中的字符有沒有 / 都沒有影響。也就是說 /user/ 和 /user 是一樣的(精確匹配和普通匹配同時(shí)存在時(shí)會(huì)有不一樣的情況)。注意,這里有問題,官網(wǎng)這個(gè)地方說明的應(yīng)該是訪問請(qǐng)求時(shí),客戶端發(fā)來(lái)的請(qǐng)求有無(wú) / 的問題。而 location 后面定義的 uri 是否有結(jié)尾的 / 卻是很多人沒有注意到的,這個(gè)后面我們也會(huì)演示到。
如果 URI 結(jié)構(gòu)是 https://www.zyblog.com.cn/ 的形式,尾部有沒有 / 都不會(huì)造成重定向。因?yàn)闉g覽器在發(fā)起請(qǐng)求的時(shí)候,默認(rèn)加上了 / 。雖然很多瀏覽器在地址欄里也不會(huì)顯示 / 。這一點(diǎn),可以訪問baidu驗(yàn)證一下。
如果 URI 的結(jié)構(gòu)是 https://www.zyblog.com.cn/some-dir/ 。尾部如果缺少 / 將導(dǎo)致重定向。因?yàn)楦鶕?jù)約定,URL 尾部的 / 表示目錄,沒有 / 表示文件。所以訪問 /some-dir/ 時(shí),服務(wù)器會(huì)自動(dòng)去該目錄下找對(duì)應(yīng)的默認(rèn)文件。如果訪問 /some-dir 的話,服務(wù)器會(huì)先去找 some-dir 文件,找不到的話會(huì)將 some-dir 當(dāng)成目錄,301重定向到 /some-dir/ ,去該目錄下找默認(rèn)文件。可以去測(cè)試一下你的網(wǎng)站是不是這樣的。
root根目錄
為請(qǐng)求設(shè)置根目錄。
root?path;
默認(rèn)就是當(dāng)前運(yùn)行環(huán)境下的 html 目錄,比如我的 Nginx 的安裝目錄是 /usr/local/nginx ,默認(rèn)情況下就是這個(gè)目錄的相對(duì)路徑 ,它的默認(rèn)值就是 /usr/local/nginx/html ,也可以配置成絕對(duì)路徑。大家在正式開發(fā)以及線上環(huán)境使用時(shí),通常都會(huì)設(shè)置一個(gè)項(xiàng)目的基礎(chǔ)路徑,往往就需要通過 root 來(lái)指定。而且這個(gè)配置指令其實(shí)更多的會(huì)配置到 Server 下面,只不過我們將它放到了 Location 一起講解,另外它在 http 下也可以進(jìn)行全局的配置。順序是 location 沒配就找 server 的,server 也沒配就找 http 的,http 也沒配呢?就是上面說的默認(rèn)值嘛。要是這個(gè)文件夾還沒有呢?404 或者 403 或者什么錯(cuò)誤唄,反正我沒試過,大家自己試試吧。
location?/i/?{
????root?/data/w;
}
訪問 /i/top.gif 的話,將使用的是 /data/w/i/top.gif 文件。文件路徑的構(gòu)造僅僅是將 URI 拼在 root 指令的值后面。
location /root_test1/ {
root /home/www/html1;
}
location /root_test2/ {
root /home/www/html1/;
}
對(duì)于這兩個(gè)配置,我們?cè)O(shè)置的目錄都是 /home/www/html1 這個(gè)目錄,但稍有不同,/root_test2 的配置中,root 的最后多了一個(gè)斜杠。然后在實(shí)際的目錄中,/home/www/html1/root_test1 目錄下有一個(gè) index.html 文件,/home/www/html1/root_test2 目錄下有一個(gè) 1.html 文件。以下是訪問的情況說明,順帶演示結(jié)尾 / 的問題:
訪問 /root_test1/ 和 /root_test2/ ,root_test1 正常返回 index.html ,root_test2 返回 403 ,錯(cuò)誤日志報(bào)錯(cuò)?
directory index of "/home/www/html1/root_test2/" is forbidden
訪問 /root_test1 和 /root_test2 都返回404
指定文件訪問均正常,比如 /root_test1/index.html 和 /root_test2/1.html
將 location 中的末尾斜杠去掉。
location /root_test1 {
root /home/www/html1;
}
location /root_test2 {
root /home/www/html1/;
}
訪問 /root_test1/ 和 /root_test2/ ,效果和上面的一樣
訪問 /root_test1 和 /root_test2 ,產(chǎn)生302,就是上面末尾斜杠問題第三個(gè)解釋
綜上所測(cè),location 路徑的末尾斜杠對(duì)訪問結(jié)果有影響的,有斜杠會(huì)認(rèn)定為是目錄,客戶端不帶斜杠訪問會(huì)404,而沒有斜杠的配置在客戶端訪問時(shí)會(huì)進(jìn)行301跳轉(zhuǎn)到目錄再進(jìn)行訪問
root 目錄末尾的斜杠和上面測(cè)試的報(bào)錯(cuò)沒有關(guān)系,將 root_test1 中的 index.html 改名或者刪除,使用 /root_test1/ 訪問,一樣會(huì)報(bào) 403 錯(cuò)誤。也就是說,目錄末尾那個(gè)斜杠基本沒啥影響,上面兩種寫法基本是一樣的。但是在沒有默認(rèn) index 的情況下,訪問路徑帶不帶末尾的斜杠則會(huì)產(chǎn)生不同的效果,不帶的會(huì)正常返回 404 ,而帶的則會(huì)報(bào) 403 錯(cuò)誤。這一點(diǎn)大家在配置的時(shí)候是需要注意的。403 錯(cuò)誤的問題我們?cè)谖恼伦詈髸?huì)說到。
配置中 path 參數(shù)的值中可以包含除?$document_root?和
$realpath_root 以外的變量。如果需要修改URI,應(yīng)該使用alias指令。alias 是讓當(dāng)前這個(gè) location 完全走 alias 中配置的內(nèi)容,不會(huì)再將 location 的 URI 中 path 部分拼接到 alias 后面,只拼接實(shí)際的文件,比如之前我們?cè)?location 中學(xué)習(xí)過的:
location?/i/?{
?alias?/home/www/html1/;
}
那么訪問 /i/1.gif ,訪問的目錄路徑就是 /home/www/html1/1.gif 。一定要區(qū)分清楚 root 和 alias 的區(qū)別。
alias別名替換路徑
這個(gè)別名替換的意思其實(shí)是替換的 root 這個(gè)配置指令。先看下這它的配置指令。
alias?path;
它主要用于定義指定路徑的替換路徑。啥意思?如果我們?cè)诋?dāng)前這個(gè) location 中,沒有指定 root ,那么 root 會(huì)向上尋找,比如我們?cè)?server 定義的 root 。
//?nginx.conf
……
server?{
?root?html;
?………………
?location?/i?{
???alias?/home/www/html1/;
??}
?……
}
……
如果我們不使用 alias ,那么 /i 將會(huì)訪問 /usr/local/nginx/html/i 這個(gè)目錄,但是現(xiàn)在,它將替換成 /home/www/html1這個(gè)目錄。在 /home/www/html1 目錄下新建一個(gè) index.html ,里面就直接寫一行字,然后訪問一下 http://192.168.56.88/i 看看是不是你寫的那行字。
注意 alias 結(jié)尾的斜杠,alias 是將請(qǐng)求中除 /i 路徑之外的路徑直接拼接到后面。因此,如果沒有結(jié)尾的斜杠的話,訪問 /i/1.gif ,將會(huì)查找的是 /home/www/html11.gif 這樣一個(gè)路徑。同理,如果我們只是訪問路徑,也需要注意最后的斜杠問題。這一點(diǎn)大家可以自己試一下哦,location 上的斜杠和 alias 的斜杠也會(huì)有相互影響。
對(duì)于圖片、視頻或者子目錄來(lái)說,都是一樣的效果。另外,它還可以針對(duì)正則進(jìn)行操作實(shí)現(xiàn)類似于文件名重寫的功能。
location?~*?/i/(.+)\.htm?{
?alias?/home/www/html1/new_$1.html;
}
看出來(lái)是什么意思了嘛,Location 的正則規(guī)則是 /i/xxxx.htm 都可以匹配。然后,我們需要拿到 xxxx 的內(nèi)容,這里就使用了一個(gè)括號(hào)。一般的正則表達(dá)式,括號(hào)都可以通過類似于?$0-N 這樣的方式拿到,一般 $0 是整個(gè)正則的匹配內(nèi)容,而 $1 就是第一個(gè)括號(hào)里面的匹配內(nèi)容。因此,我們?cè)诂F(xiàn)在就通過 $1 獲取到括號(hào)中的內(nèi)容。
接下來(lái)我在 /home/www/html1 目錄下建立兩個(gè)文件,分別是 new_a.html 和 new_b.html 文件。內(nèi)容隨便自己寫,能區(qū)分開就好了。
最后訪問 http://192.168.56.88/i/a.htm 或 http://192.168.56.88/i/b.htm ,結(jié)果會(huì)顯示 new_a.html 和 new_b.html 的內(nèi)容。
是不是很好玩??!這里需要注意的是,如果配置成目錄并且訪問目錄的話,那么只會(huì)找別名目錄下的 index.html 文件。
最后,如果路徑需要對(duì)應(yīng)指令 path 值的最后一部分,比如說
location?/images/?{
????alias?/data/w3/images/;
}
那么其實(shí)不如直接就使用 root 還好些。
location?/images/?{
????root?/data/w3;
}
一定要注意它和root之間的區(qū)別,一開始我也是懵圈的,而且很容易搞混。
內(nèi)部訪問 Location
內(nèi)部訪問的意思就是只能通過 Nginx 內(nèi)部訪問,無(wú)法從外部直接訪問的 URI 。它的配置非常簡(jiǎn)單,在 location 中添加一個(gè)配置指令即可。
internal
就這么簡(jiǎn)單的一個(gè)指令,可以指定一個(gè)路徑是否只能用于內(nèi)部訪問。如果是外部訪問,客戶端將收到 404 (Not Found) 錯(cuò)誤。下面的這些請(qǐng)求被看作是內(nèi)部請(qǐng)求:
由 error_page 指令、index 指令、 random_index 指令和 try_files 指令引起的重定向請(qǐng)求
由后端服務(wù)器返回的 “X-Accel-Redirect” 響應(yīng)頭引起的重定向請(qǐng)求
由 ngx_http_ssi_module 模塊和 ngx_http_addition_module 模塊的 “include virtual” 指令產(chǎn)生的子請(qǐng)求
用 rewrite 指令對(duì)請(qǐng)求進(jìn)行修改
明白啥意思了沒?其實(shí)就是我們直接使用瀏覽器訪問的話,這個(gè)有 internal 配置的 location 就會(huì)返回 404 。來(lái)試下吧。
error_page???500?502?503?504??/50x.html;
location?=?/50x.html?{
??root???html;
}
上面的配置是默認(rèn)情況下 nginx.conf 中對(duì)于 500 系列相關(guān)錯(cuò)誤的處理,直接跳轉(zhuǎn)到 Nginx 運(yùn)行目錄下的 html 文件夾中的 50x.html ?,F(xiàn)在直接訪問 http://192.168.56.88/50x.html ,是可以直接看到那個(gè) 50x.html 靜態(tài)頁(yè)面的。而如果加上 internal ,就像下面這樣。
location?=?/50x.html?{
??internal;
??root???html;
}
現(xiàn)在直接訪問 http://192.168.56.88/50x.html ,會(huì)返回 404 ,我們?cè)偬砑右粋€(gè) location 。
location?=?/to500?{
??rewrite?.*?/50x.html?last;
}
這個(gè) location 的意思是訪問 /to500 這個(gè) URI 后,直接通過重寫指令轉(zhuǎn)換給另一個(gè) location 處理。然后進(jìn)行測(cè)試,會(huì)發(fā)現(xiàn)我們可以正??吹?50x.html 頁(yè)面的內(nèi)容了。
循環(huán)重定向
Nginx 限制每個(gè)請(qǐng)求只能最多進(jìn)行 10 次內(nèi)部重定向,以防配置錯(cuò)誤引起請(qǐng)求處理出現(xiàn)問題。如果內(nèi)部重定向次數(shù)已達(dá)到 10 次,Nginx 將返回 500 (Internal Server Error) 錯(cuò)誤。同時(shí),錯(cuò)誤日志中將有 “rewrite or internal redirection cycle” 的信息。這一點(diǎn)也比較好測(cè),不停地向自己跳轉(zhuǎn)就好了。
location?=?/to500?{
?rewrite?.*?/to500?last;
}
還是使用 /to500 這個(gè)路徑,然后訪問一下,就會(huì)發(fā)現(xiàn)出現(xiàn)了 500 錯(cuò)誤。接著我們看下 error.log 里面的內(nèi)容。
2022/08/02?22:02:39?[error]?1470#0:?*12?rewrite?or?internal?redirection?cycle?while?processing?"/to500",?client:?192.168.56.1,?server:?core.nginx.test,?request:?"GET?/to500?HTTP/1.1",?host:?"192.168.56.88"
很明確的報(bào)錯(cuò)信息吧,以后如果看到 “rewrite or internal redirection cycle” 的報(bào)錯(cuò)信息了,趕緊檢查一下是不是有循環(huán)重定向的問題吧。
無(wú)目錄或者無(wú)index.html
如果我們 location 指定的目錄在 root 路徑下不存在會(huì)是什么情況?
location?/nodic/?{
}
不管怎么訪問,都會(huì)是 404 的錯(cuò)誤頁(yè)面。那么如果只有一個(gè)目錄,里面是空的呢?也就是說,沒有默認(rèn)的 index.html 文件存在。
location?/noindex/?{
}
//?/usr/local/nginx/html
mkdir?noindex
直接訪問 /noindex/ ,返回的是 403 ,直接訪問 /noindex ,會(huì) 301 ,訪問 /noindex/xxx.html 返回的是 404 。Nginx 將目錄訪問會(huì)定位到 index 指定的文件,默認(rèn)就是 index.html ,如果找不到這個(gè)文件,就統(tǒng)一報(bào) 403 。注意,它和權(quán)限沒關(guān)系,即使你把 noindex 的目錄權(quán)限改為 www 也是沒用的,還是報(bào) 403 錯(cuò)誤。
總結(jié)
好了,HTTP 模塊中,最最核心的兩個(gè)部分:Server 和 Location 子模塊都學(xué)習(xí)完了,剩下的,就是一大堆大大小小的配置項(xiàng),根據(jù)功能的不同,也進(jìn)行了一些拆分組合,盡量將相同類似的功能配置放在了一起。后續(xù)的內(nèi)容還非常多,咱們只是剛剛起了個(gè)小步而已,大家要跟上哦。
參考文檔:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-551790.html
http://nginx.org/en/docs/http/ngx_http_core_module.html#location文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-551790.html
到了這里,關(guān)于【Nginx06】Nginx學(xué)習(xí):HTTP核心模塊(三)Location的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!