<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          決定努力學(xué)Nginx/OpenResty詳解,location路由規(guī)則配置詳解了

          共 4057字,需瀏覽 9分鐘

           ·

          2022-03-06 13:07

          location路由規(guī)則配置詳解

          location路由匹配發(fā)生在HTTP請(qǐng)求處理的find-config配置查找階段,主要功能是:根據(jù)請(qǐng)求的URI地址匹配location路由表達(dá)式,如果匹配成功,就執(zhí)行l(wèi)ocation后面的上下文配置塊。

          實(shí)戰(zhàn)案例說明

          本節(jié)的配置實(shí)例處于源碼工程的nginx-location-demo.conf配置文件中。在運(yùn)行本節(jié)的實(shí)例前,需要修改openresty-start.bat(或openresty-start.sh)腳本中的PROJECT_CONF配置文件變量的值,將其修改為nginx-location-demo.conf,然后重啟OpenRestry/Nginx。


          ?location語法詳解

          Nginx配置文件中,location配置項(xiàng)的語法格式如下:

          location [=|~|~*|^~] 模式字符串 {
          ...
          }

          按照匹配的符號(hào)不同,location路由匹配主要分成精準(zhǔn)匹配、普通匹配、正則匹配、默認(rèn)根路徑匹配。下面逐一進(jìn)行介紹。

          1.精準(zhǔn)匹配

          精準(zhǔn)匹配的符號(hào)標(biāo)記為“=”,下面是一個(gè)簡(jiǎn)單的精準(zhǔn)匹配location的例子。

           #精準(zhǔn)匹配
          location = /lua {
          echo "hit location: =/Lua";
          }

          如果請(qǐng)求URI和精準(zhǔn)匹配的模式字符串/lua完全相同,那么精準(zhǔn)匹配通過。

          在所有的匹配類型中,精準(zhǔn)匹配的優(yōu)先級(jí)最高。

          運(yùn)行本文的配套案例,在同時(shí)存在多個(gè)/lua匹配模式location的情況下,在瀏覽器中給Nginx發(fā)送http://localhost/lua的請(qǐng)求地址,輸出的是精準(zhǔn)匹配的結(jié)果,如圖7-12所示。

          圖7-12 輸出精準(zhǔn)匹配

          2.普通匹配

          普通匹配的符號(hào)標(biāo)記為“^~”,下面是一個(gè)簡(jiǎn)單的普通匹配location的例子。

           location ^~ /lua {
          echo "hit location: ^~ /lua";
          }

          普通匹配屬于字符串前綴匹配,詳細(xì)來說:如果請(qǐng)求路徑URI頭部匹配到location的模式字符串,那么匹配成功。如果匹配到多個(gè)前綴,那么最長(zhǎng)模式匹配優(yōu)先。

          本文配套實(shí)例中配置了以下兩個(gè)普通匹配類型的location,具體配置如下:

          #普通匹配一
          location ^~ /lua {
          echo "普通匹配: ^~ /lua";
          }
          #普通匹配二,長(zhǎng)一點(diǎn)
          location ^~ /lua/long {
          echo "普通匹配: ^~ /lua/long";
          }

          在瀏覽器中給Nginx發(fā)送
          http://localhost/lua/long/path
          的請(qǐng)求地址,輸出了普通匹配location的結(jié)果,如圖7-13所示。

          圖7-13 輸出普通匹配

          注意

          普通匹配是前綴匹配,也是Nginx默認(rèn)的匹配類型。也就是說,類型符號(hào)“^~”可以省略,如果location沒有任何匹配類型,就為普通的前綴匹配。如果一個(gè)URI命中多個(gè)location普通匹配,則最長(zhǎng)的location普通匹配獲勝。

          為了對(duì)以上結(jié)論進(jìn)行論證,這里舉一個(gè)例子,在配置文件中配置兩個(gè)同樣字符串模式的location,一個(gè)不帶類型符號(hào),一個(gè)帶“^~”符號(hào),具體如下:

          #不帶類型符號(hào),默認(rèn)為普通匹配
          location /demo {
          echo "hit location: /demo ";
          }
          #帶“^~”符號(hào),普通匹配
          location ^~ /demo {
          echo "hit location: ^~ /demo";
          }

          執(zhí)行重啟Nginx的腳本openresty-restart.bat,發(fā)現(xiàn)Nginx不能啟動(dòng),查看error.log錯(cuò)誤日志,報(bào)錯(cuò)信息如下:

          ... 17:33:39 [emerg] 18760#25944: duplicate location "/demo" in .../nginx-location-demo.conf:115

          從錯(cuò)誤信息可以看出,在配置文件中有兩個(gè)重復(fù)的location配置。

          3.正則匹配

          正則匹配的類型按照類型符號(hào)的不同可以細(xì)分為以下4種:

          (1)~:標(biāo)準(zhǔn)正則匹配,區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試成功,則匹配成功。

          (2)~*:標(biāo)準(zhǔn)正則匹配,不區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試成功,則匹配成功。

          (3)!~:反向正則匹配,區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試不成功,則匹配成功。

          (4)!~*:反向正則匹配,不區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試不成功,則匹配成功。下面是一個(gè)正則匹配的例子,可以匹配以hello.php或hello.asp結(jié)尾的URL請(qǐng)求。

           #正則匹配
          location ~*hello\.(asp|php)$ {
          echo "正則匹配: hello.(asp|php)$ ";
          }

          在瀏覽器中給Nginx發(fā)送
          http://localhost/1/2/hellp.php
          的請(qǐng)求地址,輸出的請(qǐng)求結(jié)果如圖7-14所示。

          圖7-14 輸出的請(qǐng)求結(jié)果

          如果配置文件中存在多個(gè)正則匹配location,那么它們之間的規(guī)則是順序優(yōu)先的,只要匹配到第一個(gè)正則類型的location,就停止后面的正則類型的location測(cè)試。

          例如,這里有兩個(gè)正則匹配的location規(guī)則:\.(do|jsp)$和hello\.(do|jsp)$,具體如下:

          #正則匹配類型
          location ~*\.(do|jsp)$ {
          echo "正則匹配: .(do|jsp)$ ";
          }
          #正則匹配類型
          location ~*hello\.(do|jsp)$ {
          echo "正則匹配: hello.(do|jsp)$ ";
          }

          在瀏覽器中給Nginx發(fā)送
          http://localhost/1/2/hellp.do
          的請(qǐng)求地址,輸出的結(jié)果是由配置在前面的location輸出的,如圖7-15所示。

          圖7-15 輸出結(jié)果

          4.默認(rèn)根路徑匹配

          根路徑的路徑規(guī)則就是使用單個(gè)“/”符號(hào),示例如下:

           location / {
          echo "默認(rèn)根路徑匹配: /";
          }

          通過瀏覽器隨便訪問一個(gè)地址,如http://localhost/foo,使之不能匹配到其他的location,只能匹配到“/”根路徑,返回的結(jié)果如圖7-16所示。

          圖7-16 返回的結(jié)果

          表面看上去,location/{...}根路徑匹配非常類似普通匹配,但實(shí)際上該規(guī)則自成一類,雖然只有唯一的一個(gè)路徑,但是此類規(guī)則優(yōu)先級(jí)是最低的。

          最后總結(jié)一下4種location之間的匹配次序,大致如下:

          (1)類型之間的優(yōu)先級(jí):精準(zhǔn)匹配>普通匹配>正則匹配>“/”默認(rèn)根路徑匹配。

          (2)普通匹配同類型location之間的優(yōu)先級(jí)為最長(zhǎng)前綴優(yōu)先。普通匹配的優(yōu)先級(jí)與location在配置文件中所處的先后順序無關(guān),而與匹配到的前綴長(zhǎng)度有關(guān)。

          (3)正則匹配同類型location之間的優(yōu)先級(jí)為順序優(yōu)先。只要匹配到第一個(gè)正則規(guī)則的location,就停止后面的正則規(guī)則的測(cè)試。正則匹配與location規(guī)則定義在配置文件中的先后順序強(qiáng)相關(guān)。

          ?常用的location路由配置

          第一個(gè)應(yīng)該配置的屬于“/”根路由規(guī)則。“/”根路由規(guī)則可以路由到一個(gè)靜態(tài)首頁:

          location / {
          root html;
          index index.html index.htm;
          }

          表示在請(qǐng)求URI匹配到“/”根路由規(guī)則時(shí),首先Nginx會(huì)在html目錄下查找index.html文件,如果沒有找到,就查找index.htm文件,將找到的文件內(nèi)容返回給客戶端。

          “/”根路由規(guī)則也可以路由到一個(gè)訪問很頻繁的上游服務(wù),比如Spring Cloud微服務(wù)架構(gòu)中的服務(wù)網(wǎng)關(guān):

          location / {
          proxy_pass http://127.0.0.1:7799/ ;
          }

          這里的127.0.0.1:7799假定為Zuul網(wǎng)關(guān)的IP和端口,當(dāng)請(qǐng)求匹配到“/”根路由規(guī)則時(shí),將直接轉(zhuǎn)發(fā)給上游Zuul應(yīng)用網(wǎng)關(guān)服務(wù)器。

          第二個(gè)應(yīng)該配置的屬于靜態(tài)文件路由規(guī)則。對(duì)靜態(tài)文件請(qǐng)求進(jìn)行響應(yīng),這是Nginx作為HTTP服務(wù)器的強(qiáng)項(xiàng)。靜態(tài)文件匹配規(guī)則有兩種配置方式:目錄匹配(前綴匹配)和后綴匹配(正則匹配),可以任選其一,也可以搭配使用。

          目錄匹配(前綴匹配)配置實(shí)例如下:

          root /www/resources/static/;
          #前綴匹配
          location ^~ /static/ {
          root /www/resources/;
          }

          所有匹配/static/...規(guī)則的靜態(tài)資源請(qǐng)求(如/static/img/1.png)都將路由到root指令所配置的文件目錄/www/resources/static/下對(duì)應(yīng)的某個(gè)文件(如/
          www/resources/static/img/1.png
          )。

          后綴匹配(正則匹配)配置實(shí)例如下:

          location ~*\.(gif|jpg|jpeg|png|css|js|ico)${
          root /www/resources/;
          }

          所有匹配到以上正則規(guī)則的靜態(tài)資源請(qǐng)求(如/static/img/2.png)都將路由到root指令所配置的文件目錄/www/resources/static/下對(duì)應(yīng)的某個(gè)文件(如/
          www/resources/static/img/2.png
          )。

          本文給大家講解的內(nèi)容是Nginx/OpenResty詳解,location路由規(guī)則配置詳解

          1. 下篇文章給大家講解的是 Nginx/OpenResty詳解,Nginx的rewrite模塊指令;

          2. 覺得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;

          3. 感謝大家的支持!


          本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學(xué)習(xí)更多的話可以到微信公眾號(hào)里找我,我等你哦。

          瀏覽 98
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人射人人操 | 俺去听听婷婷 | 日本一二三区视频 | 小泽玛利亚性爱视频 | 欧美操逼視频在线观看 |