簡明 Nginx Location Url 配置筆記

基本配置

為了探究nginx的url配置規(guī)則,當(dāng)然需要安裝nginx。我使用了vagrant創(chuàng)建了一個虛擬環(huán)境的ubuntu,通過apt-get安裝nginx类溢。這樣就不會污染mac的軟件環(huán)境。通過vragrant再創(chuàng)建一個項(xiàng)目進(jìn)行實(shí)驗(yàn)。如果不了解vagrant的使用闯冷,可以查看Vagrant 虛擬環(huán)境利器砂心。

/vagrant目錄下創(chuàng)建了一個pro用于項(xiàng)目的根目錄,同時(shí)配置nginx的配置文件(/etc/nginx/sites-enabled/pro.conf)

?  pro  tree
.
├── 403.html
├── 404.html
├── index.html

0 directories, 3 files

pro.conf的配置如下蛇耀,即監(jiān)聽本機(jī)的80端口辩诞。

server {
   listen 80 default_server;
   server_name localhost;

   access_log /var/log/nginx/pro/access.log;
   error_log /var/log/nginx/pro/error.log;

   error_page 404 /404.html;

   root /vagrant/pro;
   index index.html index.htm;
  
}

上述的配置并沒有設(shè)置location,但是配置了root /vagrant/pro纺涤,訪問http://192.168.33.10/將會返回/vagrant/pro/index.html译暂。

匹配模式

匹配語法

nginx的url匹配模式很強(qiáng)大,同時(shí)使用非常靈活撩炊,尤其是優(yōu)先級的匹配外永,如果不尋找規(guī)律,不但很難掌握拧咳,而且容易犯暈伯顶。了解優(yōu)先級之前,先看看匹配的配置語法呛踊,以及都有那些匹配模式。

匹配的語法還是很簡單的:

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

沒錯啦撮,就這么多谭网,實(shí)際寫在loacation中大概是這樣的

location = / {
    
}
location  [指令模式] url匹配模式 {
    
}

指令模式指用于匹配的方式,即精確匹配,前綴匹配還是正則匹配赃春,當(dāng)然這個是可選的愉择,如果不寫,則退化成正常匹配或者全匹配织中。url匹配模式則需要匹配的url锥涕,可以看成是web開發(fā)中的路由。下面就分別介紹指令模式和匹配模式狭吼。

精確匹配

=指令用于精確字符匹配(模式)层坠,不能使用正則,區(qū)分大小寫刁笙。為了直觀的觀察匹配命中的location破花,使用rewrite指令,用于轉(zhuǎn)發(fā)疲吸。目前只要理解命中了就重定向到rewrite后面的url即可座每。

location = /demo {
    rewrite ^ http://google.com;
}

上述的配置表示只有訪問 http://192.168.33.10/demo 這樣的url,才能跳轉(zhuǎn)到google的頁面摘悴。除此之外的任何地址都無法訪問峭梳,那怕是訪問http://192.168.33.10/demo/這個地址也不行。因?yàn)閡rl匹配模式是/demo蹂喻。

修改 location:

location = /demo$ {
    rewrite ^ http://google.com;
}

熟悉正則的同學(xué)初看會以為/demo$表示demo結(jié)尾的url葱椭,其實(shí)不然捂寿,這里的$符號也是url的一部分,只有訪問http://192.168.33.10/demo$這個地址才能跳轉(zhuǎn)挫以。

前綴匹配

^~指令用于字符前綴匹配者蠕,和=精確匹配一樣,也是用于字符確定的匹配掐松,不能使用正則且區(qū)分大小寫踱侣。和=不同的在于,^~指令下大磺,訪問的url無需url匹配模式一模一樣抡句,只需要其開頭前綴和url匹配模式一樣即可。

location ^~ /demo {
    rewrite ^ http://google.com;
}

對于該模式(/demo)杠愧,訪問下列的地址都能匹配:

只需要以/demo為前綴開頭的url都能匹配待榔。與該模式后的是否大小寫無關(guān)。

^~不支持正則流济。模式/demo$中的$并不代表字符模式結(jié)束锐锣,而是一個是實(shí)實(shí)在在的$,只有訪問/demo$開頭的url才能匹配绳瘟,http://192.168.33.10/demo則不再匹配雕憔。

模式/[0-9]emo也不代表正則中的http://192.168.33.10/0emohttp://192.168.33.10/5emo之類糖声,只有訪問以 /[0-9]emo開頭url才行斤彼,例如http://192.168.33.10/[0-9]emohttp://192.168.33.10/[0-9]emo/aaa

前綴匹配通常用于匹配文件夾,如配置靜態(tài)文件蘸泻。

正則匹配

眾所周知琉苇,nginx的url功能強(qiáng)大,配置靈活悦施。字符匹配中并扇,支持正則和不支持正則完全是兩個境界。前面的兩種方式都不能使用正則抡诞,未免讓人覺得nginx有點(diǎn)虛夸拜马。

實(shí)際上,nginx支持正則匹配沐绒。所使用的指令是~~*俩莽,前者表示使用正則,區(qū)分大小寫乔遮,后者表示使用正則扮超,不區(qū)分大小寫。與前綴匹配一樣,正則匹配也是只需匹配以url模式開頭的即可出刷。

location ~ /[0-9]emo {
    rewrite ^ http://google.com;
}

對于上述的模式璧疗,可以匹配的url如下:

只要是以正則表達(dá)式/[0-9]emo匹配的字符開頭的url,都能匹配馁龟。

使用~*則不區(qū)分大小寫

location ~ /[0-9]EmO {
    rewrite ^ http://google.com;
}

下面的都能匹配

正常匹配

正常匹配的指令為空崩侠,即沒有指定匹配指令的即為正常匹配。其形式類似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正則坷檩,不區(qū)分大小寫却音。

location /demo {
    rewrite ^ http://google.com;
}

上述模式指的是匹配/demo的url,下面的都能匹配

正常匹配和前綴匹配的差別在于優(yōu)先級矢炼。前綴的優(yōu)先級高于正常匹配

全匹配

全匹配與正常匹配一樣系瓢,沒有匹配指令,匹配的url模式僅一個斜杠/

location / {
    rewrite ^ http://google.com;
}

全匹配也可以配合 精確匹配和正則匹配一些指令句灌,只不過這樣的設(shè)定意義不大夷陋。通過都會有一個默認(rèn)的location,這個就是全匹配胰锌。

命名匹配

命名匹配指的是使用@比綁定一個模式骗绕,類似變量替換的用法。

error_page 404 = @not_found

location @not_found {
      rewrite http://google.com;
}

上述的作用是如果訪問沒有匹配的url會觸發(fā)404指令资昧,然后就匹配到@not_found 這個 location上酬土。

匹配優(yōu)先級

nginx的匹配優(yōu)先級遵循一個大原則兩個小細(xì)節(jié)

大原則是關(guān)于匹配模式的優(yōu)先級:

精確匹配  >  前綴匹配  >  正則匹配  > 正常匹配  > 全匹配

小細(xì)節(jié)則是同一優(yōu)先級中:

  • 細(xì)節(jié)一:正則匹配成功之后停止匹配榛搔,非正則匹配成功還會接著匹配诺凡。
  • 細(xì)節(jié)二:在所有匹配成功的url中东揣,選取匹配度最大的url字符地址践惑。

不同級匹配模式優(yōu)先級原則

精確匹配 > 前綴匹配

=精確匹配的優(yōu)先級最高,這與配置的先后順序無關(guān)

location ^~ /demo{
    rewrite ^ http://google.com;
}

location = /demo {
    rewrite ^ http://baidu.com;
}

訪問

http://192.168.33.10/demo    -> baidu.com
http://192.168.33.10/demo/ggg -> google.com

盡管前綴匹配也能匹配/demo這個地址嘶卧,并且還先命中尔觉,可是=的優(yōu)先級更高。

再把前綴匹配換成正則匹配

location ~ /demo{
    rewrite ^ http://google.com;
}

location = /demo {
    rewrite ^ http://baidu.com;
}

訪問結(jié)果仍然一樣芥吟。精確匹配的優(yōu)先級最高侦铜。

前綴匹配 > 正則匹配

location ~ /[ad]emo{
    rewrite ^ http://google.com;
}

location ^~ /demo {
    rewrite ^ http://baidu.com;
}

上述兩個模式中,第一個使用正則匹配钟鸵,第二個使用前綴匹配钉稍,訪問效果如下

http://192.168.33.10/demo    -> baidu.com
http://192.168.33.10/aemo     -> google.com

由此可見,盡管也是正則匹配先命中規(guī)則棺耍,可以優(yōu)先級低贡未,還是讓步給前綴匹配。

正則匹配 > 正常匹配

location /demo/aa{
      rewrite ^ http://google.com;
}

location ~ /[ad]emo {
      rewrite ^ http://baidu.com;
}
http://192.168.33.10/demo/aa        -> baidu.com  
http://192.168.33.10/aemo/aa     -> baidu.com  

訪問/demo/aa的地址的時(shí)候,盡管前者位置在前俊卤,并且也匹配最長嫩挤,可是大規(guī)則的優(yōu)先級,還是要先進(jìn)行后面的正則匹配消恍。小細(xì)節(jié)也必須讓步大規(guī)則岂昭。

正常匹配 > 全匹配

location / {
    rewrite ^ http://google.com;
}

location /demo {
    rewrite ^ http://baidu.com;
}

訪問結(jié)果

http://192.168.33.10          -> index.html
http://192.168.33.10/         -> google.comg
http://192.168.33.10/demo       -> baidu.com  
http://192.168.33.10/demo/aa  -> baidu.com  

由此可見,全匹配的優(yōu)先級最低狠怨。

同級匹配細(xì)節(jié)

同級的匹配需要注意兩個關(guān)鍵細(xì)節(jié)约啊,是否是正則匹配是否是最長匹配取董。

非正則匹配

location /demo {
    rewrite ^ http://google.com;
}

location /demo/aa {
    rewrite ^ http://baidu.com;
}

訪問測試

http://192.168.33.10/demo     -> google.com
http://192.168.33.10/demo/aa  -> baidu.com 

第一個連接只匹配了第一個location棍苹,跳轉(zhuǎn)google.com;第二個連接兩者都匹配茵汰,可是第二個location的匹配字符更長枢里,因此跳轉(zhuǎn)了baidu.com。

把正常匹配換成前綴匹配的效果也一樣蹂午。

location ^~ /demo {
    rewrite ^ http://google.com;
}

location ^~ /demo/aa {
    rewrite ^ http://baidu.com;
}

訪問結(jié)果如下:

http://192.168.33.10/demo     -> google.com
http://192.168.33.10/demo/aa  -> baidu.com 

通過上面的測試栏豺,可見同級的非正則的匹配,匹配結(jié)果最長的location最終會被命中豆胸。其實(shí)這個很好理解奥洼,匹配的字符越多,優(yōu)先級越大嘛晚胡。但是為什么這個原則要特指非正則的匹配呢灵奖?

正則匹配

正則匹配不適用最大匹配的原則,本質(zhì)原因是因?yàn)檎齽t一旦匹配了估盘,就停止匹配其他location瓷患,因此正則匹配與配置的先后順序有關(guān)。

location ~ /demo {
    rewrite ^ http://google.com;
}

location ~ /demo/aa {
    rewrite ^ http://baidu.com;
}
http://192.168.33.10/demo/aa  -> http://google.com

nginx開始匹配location的模式遣妥,其中/demo已經(jīng)匹配了http://192.168.33.10/demo/aa這個地址擅编,因此停止搜索匹配其他的location。

下面更改一下上述配置的先后順序:

location ~ /demo/aa {
    rewrite ^ http://baidu.com;
}

location ~ /demo {
    rewrite ^ http://google.com;
}

訪問測試:

http://192.168.33.10/demo/aa  -> http://baidu.com

由此可見箫踩,正則匹配與匹配最大長度無關(guān)爱态,只與匹配的先后順序有關(guān)。

歸納

通過上述兩個模式的測試境钟,我們對兩個細(xì)節(jié)進(jìn)行了倒序的推導(dǎo)锦担。實(shí)際上使用記住兩個細(xì)節(jié)會比較簡單。判斷同級的優(yōu)先級歸納如下:

面對一個location慨削,先判斷是否是正則匹配洞渔,如果是正則匹配鱼的,遇到匹配的模式,則命中痘煤。如果不是正則凑阶,則把匹配的模式放到一邊,繼續(xù)往下閱讀配置衷快,閱讀完畢所有的匹配模式宙橱,查看哪一種的匹配模式更長,則是最終命中的模式蘸拔。

掌握nginx的location匹配優(yōu)先級其實(shí)也不難师郑,謹(jǐn)記一個原則兩個細(xì)節(jié),媽媽再也不用擔(dān)心配錯url啦调窍。

總結(jié)

nginx的url配置是使用nginx最基本功能宝冕。nginx作為服務(wù)器,它可以接收請求邓萨,處理請求地梨,都是基于客戶端url訪問。掌握url的配置要了解配置的幾個指令(=缔恳,^~)宝剖。熟悉每個匹配模式的特點(diǎn)。

了解模式之后歉甚,對于優(yōu)先級的判定万细,只需記住一個大的規(guī)則和兩個細(xì)節(jié),就能從容的應(yīng)對了纸泄。

掌握url的配置之后赖钞,更重要的是在location域中做請求的處理。比如常見的靜態(tài)文件配置聘裁,請求轉(zhuǎn)發(fā)(rewrite)雪营,負(fù)載均衡等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咧虎,一起剝皮案震驚了整個濱河市卓缰,隨后出現(xiàn)的幾起案子计呈,更是在濱河造成了極大的恐慌砰诵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌显,死亡現(xiàn)場離奇詭異茁彭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扶歪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門理肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摄闸,“玉大人,你說我怎么就攤上這事妹萨∧暾恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵乎完,是天一觀的道長熏兄。 經(jīng)常有香客問我,道長树姨,這世上最難降的妖魔是什么摩桶? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮帽揪,結(jié)果婚禮上硝清,老公的妹妹穿的比我還像新娘。我一直安慰自己转晰,他們只是感情好芦拿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著查邢,像睡著了一般防嗡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侠坎,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蚁趁,我揣著相機(jī)與錄音,去河邊找鬼实胸。 笑死他嫡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庐完。 我是一名探鬼主播钢属,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼门躯!你這毒婦竟也來了淆党?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤讶凉,失蹤者是張志新(化名)和其女友劉穎染乌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂讯,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荷憋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褐望。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勒庄。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡串前,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出实蔽,到底是詐尸還是另有隱情荡碾,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布局装,位于F島的核電站玩荠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贼邓。R本人自食惡果不足惜阶冈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塑径。 院中可真熱鬧女坑,春花似錦顷锰、人聲如沸咨堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喘先,卻和暖如春午阵,著一層夾襖步出監(jiān)牢的瞬間废岂,已是汗流浹背闷串。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工瓮钥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹吵。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓碉熄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肋拔。 傳聞我的和親對象是個殘疾皇子锈津,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)凉蜂,斷路器琼梆,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程窿吩,通過DNS域名解析服務(wù)器IP茎杂,并建...
    七寸知架構(gòu)閱讀 80,923評論 21 356
  • 配置運(yùn)行Nginx服務(wù)器用戶(組) 用于配置運(yùn)行Nginx服務(wù)器用戶(組)的指令是user,其語法格式為: use...
    吃瓜的東閱讀 4,480評論 0 41
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一爆存、I/O模型 (一)I/...
    哈嘍別樣閱讀 889評論 0 4
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx蛉顽?那么一定聽過它的“同行”Apache吧蝗砾!Ngi...
    JokerW閱讀 32,642評論 24 1,002