讓人容易混淆的Nginx的root和alias指令

Nginx的root和alias兩個(gè)指令之所以讓很多人混淆匈睁,根本原因還是沒(méi)有弄明白這兩個(gè)指令的設(shè)計(jì)用意和適用場(chǎng)景。現(xiàn)在有這么一個(gè)需求:開發(fā)小程序時(shí)桶错,請(qǐng)求的域名騰訊都需要驗(yàn)證,所以開發(fā)經(jīng)常需要放一個(gè)txt驗(yàn)證文件到域名根目錄下面胀蛮,然后騰訊通過(guò)對(duì)這個(gè)文件的訪問(wèn)來(lái)進(jìn)行域名驗(yàn)證院刁。因?yàn)闅v史原因,代碼的根目錄不對(duì)外開放粪狼,這就需要單獨(dú)定義一個(gè)location給txt驗(yàn)證文件使用退腥。那這個(gè)location怎么寫呢,首先看一個(gè)寫法再榄,你覺(jué)得請(qǐng)求 http://test.com/1234.txt Nginx會(huì)乖乖返回200么狡刘?

location /1234.txt {
    alias /data/w3/txt/;
}

想好了么?想好了我就公布答案了困鸥,Nginx的accesslog里面會(huì)有兩條記錄嗅蔬,一條301,一條403疾就,意不意外澜术,驚不驚喜?具體原因暫時(shí)不表猬腰,先來(lái)看看alias和root的官方文檔鸟废。

[23/Aug/2018:11:47:28 +0800] "GET /1234.txt HTTP/1.1" 301 284
[23/Aug/2018:11:47:28 +0800] "GET /1234.txt/ HTTP/1.1" 403 596

root和alias的官方定義

  • root:Sets the root directory for requests. A path to the file is constructed by merely adding a URI to the value of the root directive. 文檔說(shuō)的很清楚,root就是用來(lái)定義請(qǐng)求的根目錄的姑荷,最終訪問(wèn)的實(shí)際文件的路徑就是root的值+URI盒延,比如下面這種寫法,訪問(wèn) /i/top.gif 的話鼠冕,實(shí)際返回的文件是 /data/w3/i/top.gif添寺。而且文檔還特別強(qiáng)調(diào):如果需要修改URI,請(qǐng)使用alias供鸠。其實(shí)root還是比較容易理解畦贸。
location /i/ {
    root /data/w3;
}
  • alias:Defines a replacement for the specified location. If alias is used inside a location defined with a regular expression then such regular expression should contain captures and alias should refer to these captures。顧名思義楞捂,alias就是一個(gè)別名薄坏,就是用alias指令所指定的位置的別名。如果alias用在正則定義的location里面的話寨闹,正則里面必須包含捕獲組胶坠,且alias必須使用這些捕獲組

這里面容易引起混淆的就是這個(gè)別名所代表的具體內(nèi)容繁堡。分兩種情況:

location定義的path是一個(gè)目錄

定義如下沈善,訪問(wèn) /i/top.gif乡数,實(shí)際返回文件是 /data/w3/images/top.gif,注意這里對(duì) /i/ 部分用alias的值進(jìn)行替換了

location /i/ {
    alias /data/w3/images/;
}

如果location的path跟alias后部分相同闻牡,則建議使用root净赴,下面兩者等價(jià)。

location /images/ {
    alias /data/w3/images/;
}

location /images/ {
    root /data/w3;
}

location定義的path是文件

顧名思義罩润,文件的別名肯定還是文件玖翅,所以此時(shí)alias必須配置為文件。如下文

location /i/top.gif {
    alias /data/w3/images/top.gif;
}
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}

好了割以,再回到剛開始那個(gè)奇怪的例子金度。仔細(xì)分析需求,這是一個(gè) 不需要修改URI 的需求严沥,適合使用root猜极,寫法很簡(jiǎn)單。如果非要用alias消玄,也能寫出來(lái)跟伏,就是更復(fù)雜一些。

location ~* ^/.+\.txt$ {
    root /path/to/nginx/root/path/;
}
location ~* ^/(.+\.txt)$ {
    alias /path/to/nginx/root/path/$1;
}

現(xiàn)在再來(lái)看文頭的寫法就不難理解了翩瓜,第一次訪問(wèn)匹配到location酬姆,通過(guò)alias置換之后,對(duì)應(yīng)的返回文件為/data/w3/txt/奥溺,對(duì)Nginx來(lái)說(shuō)辞色,當(dāng)URL指向一個(gè)目錄并且在最后沒(méi)有包含"/"時(shí)烈和,Nginx 內(nèi)部會(huì)自動(dòng)的做一個(gè)301重定向蜂怎,并自動(dòng)添加上"/"叔锐,此時(shí)請(qǐng)求變成http://test.com/1234.txt/金踪,該訪問(wèn)依舊能進(jìn)匹配到該location搭儒,而/data/w3/txt/index.html并不存在蒋困,所以返回403癣籽。順著這個(gè)思路走下去隘竭,請(qǐng)問(wèn)訪問(wèn) http://test.com/1234.txt/1234.txt 會(huì)返回200么方灾?答案顯然是肯定的建蹄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裕偿,隨后出現(xiàn)的幾起案子洞慎,更是在濱河造成了極大的恐慌,老刑警劉巖嘿棘,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲腿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸟妙,警方通過(guò)查閱死者的電腦和手機(jī)焦人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門挥吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人花椭,你說(shuō)我怎么就攤上這事忽匈。” “怎么了矿辽?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵脉幢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗦锐,道長(zhǎng),這世上最難降的妖魔是什么沪曙? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任奕污,我火速辦了婚禮,結(jié)果婚禮上液走,老公的妹妹穿的比我還像新娘碳默。我一直安慰自己,他們只是感情好缘眶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布嘱根。 她就那樣靜靜地躺著,像睡著了一般巷懈。 火紅的嫁衣襯著肌膚如雪该抒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天顶燕,我揣著相機(jī)與錄音凑保,去河邊找鬼。 笑死涌攻,一個(gè)胖子當(dāng)著我的面吹牛欧引,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恳谎,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼芝此,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了因痛?” 一聲冷哼從身側(cè)響起婚苹,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸵膏,沒(méi)想到半個(gè)月后租副,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较性,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年用僧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了结胀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡责循,死狀恐怖糟港,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情院仿,我是刑警寧澤秸抚,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站歹垫,受9級(jí)特大地震影響剥汤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜排惨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一吭敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暮芭,春花似錦鹿驼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瑞筐,卻和暖如春凄鼻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聚假。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工野宜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魔策。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓匈子,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闯袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虎敦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容