精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

nginx中的正則表達(dá)式和location路徑匹配指南

馬哥Linux運(yùn)維 ? 來源:博客園-熊仔其人 ? 2024-09-29 16:02 ? 次閱讀

前言,我這里驗(yàn)證的nginx-v1.23.2單機(jī)環(huán)境下的nginx中的正則表達(dá)式、location路徑匹配規(guī)則和優(yōu)先級。
先準(zhǔn)備好環(huán)境,基礎(chǔ)配置是這樣 nginx/conf/conf.d/host.conf :

server {
    listen 8081;
    server_name  10.90.5.70;

    proxy_connect_timeout 60;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   "http";
    proxy_set_header    Host                $host;
    proxy_http_version  1.1;
    proxy_set_header    Connection  "";
    proxy_next_upstream error non_idempotent;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

下面的案例都是基于以上配置驗(yàn)證的。

一,nginx中的正則表達(dá)式

nginx中的正則表達(dá)式基本遵循了Regular Expression格式和規(guī)則。不同的是,一般以特殊字符代表正則表達(dá)式的開始,即標(biāo)識要用Regular Expression處理其后的字符。
nginx里面可以使用正則表達(dá)式的部分可以是 server里,或者location 路徑上。

常見的正則表達(dá)式的含義

^ :匹配輸入字符串的起始位置
$ :匹配輸入字符串的結(jié)束位置
. :匹配除“
”之外的任何單個字符,若要匹配包括“
”在內(nèi)的任意字符,請使用諸如“[.
]”之類的模式
d :匹配純數(shù)字
w :匹配字母或數(shù)字或下劃線或漢字
s :匹配任意的空白符
 :匹配單詞的開始或結(jié)束

【下面這部分是標(biāo)注匹配長度(字符數(shù)量、重復(fù)數(shù)量)的】
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
{n} :重復(fù) n 次
{n,} :重復(fù) n 次或更多次
{n,m} :重復(fù) n 到 m 次

[] :定義匹配的字符范圍
[c] :匹配單個字符 c
注意:在括號里面用-表示范圍:
[a-z] :匹配 a-z 小寫字母的任意一個
[a-zA-Z0-9] :匹配所有大小寫字母或數(shù)字
() :表達(dá)式的開始和結(jié)束位置 例如:(jpg|gif|swf|)

| :或運(yùn)算符
! :非運(yùn)算符(與其后面的表達(dá)式去反運(yùn)算)
正則表達(dá)式里面沒有“與運(yùn)算符”。

 :轉(zhuǎn)義字符,將后面接著的字符標(biāo)記為一個特殊字符或一個原義字符或一個向后引用。如“
”匹配一個換行符,而“$”則匹配“$”

參考鏈接:https://www.jb51.net/article/149053.htm

二,location路徑匹配規(guī)則和優(yōu)先級

location:用來設(shè)置請求的URI。nginx中l(wèi)ocation配置項(xiàng)是最基礎(chǔ)的配置,而且它的配置也稍顯復(fù)雜。

location匹配規(guī)則 與 優(yōu)先級

默認(rèn)值 /
語法location [ = | ~ | ~* | ^~ ] uri { ... }
位置 server,location
uri變量是待匹配的請求字符串,可以不包含正則表達(dá)式,也可以包含正則表達(dá)式。那么:

nginx服務(wù)器在搜索匹配location的時候,是先使用不包含正則表達(dá)式進(jìn)行匹配,找到一個匹配度最高的一個,然后在通過包含正則表達(dá)式的進(jìn)行匹配,如果能匹配到直接訪問,匹配不到,就使用剛才匹配度最高的那個location來處理請求。

另一種描述,意思是一樣的:

location 匹配的優(yōu)先級(與location在配置文件中的順序無關(guān))
= 精確匹配會第一個被處理。如果發(fā)現(xiàn)精確匹配,nginx停止搜索其他匹配。
普通字符匹配,正則表達(dá)式規(guī)則和長的塊規(guī)則將被優(yōu)先和查詢匹配,也就是說如果該項(xiàng)匹配還需去看有沒有正則表達(dá)式匹配和更長的匹配。
^~ 則只匹配該規(guī)則,nginx停止搜索其他匹配,否則nginx會繼續(xù)處理其他location指令。
最后匹配理帶有"~"和"~*"的指令,如果找到相應(yīng)的匹配,則nginx停止搜索其他匹配;
當(dāng)沒有正則表達(dá)式或者沒有正則表達(dá)式被匹配的情況下,那么匹配程度最高的逐字匹配指令會被使用。

location 優(yōu)先級官方文檔:

1.  Directives with the = prefix that match the query exactly. If found, searching stops.
2.  All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
3.  Regular expressions, in order of definition in the configuration file.
4.  If #3 yielded a match, that result is used. Else the match from #2 is used.

1.  =前綴的指令嚴(yán)格匹配這個查詢。如果找到,停止搜索。
2.  所有剩下的常規(guī)字符串,最長的匹配。如果這個匹配使用^?前綴,搜索停止。
3.  正則表達(dá)式,在配置文件中定義的順序。
4.  如果第3條規(guī)則產(chǎn)生匹配的話,結(jié)果被使用。否則,如同從第2條規(guī)則被使用。

它包含了路徑的匹配規(guī)則和針對該規(guī)則的配置。

location規(guī)則按照前導(dǎo)符主要分五類:

代號 前導(dǎo)符 說明
= uri 全字匹配,只有當(dāng)請求路徑和uri完全匹配時,對應(yīng)的規(guī)則才會生效
~ regular 區(qū)分大小寫的正則匹配
~* regular 不區(qū)分大小寫的正則匹配
^~ uri 否定正則的路徑匹配
url 沒有任何前導(dǎo)符的路徑匹配

這五類規(guī)則,同時存在配置文件中時,按照一定的優(yōu)先級規(guī)則生效。
優(yōu)先級:( location = ) > ( location 完整路徑 ) > ( location ^~ 否定正則 ) > ( location ~* 正則順序 ) > ( location ~ 區(qū)分大小寫正則順序 ) > ( location 部分起始路徑 ) > ( / )
優(yōu)先級:① > ④ > ③ > ② > ⑤

nginx規(guī)則決定流程如下圖:
wKgZomb5Cb2AbMf0AACDRywOs8w869.png
文字說明:
以下說明非常關(guān)鍵
一、檢查請求uri是否與某個=規(guī)則匹配,如果有,直接應(yīng)用規(guī)則,終止后續(xù)匹配。
二、nginx首先檢查所有路徑匹配規(guī)則配置項(xiàng),包括"^~"規(guī)則和沒有前導(dǎo)符號的規(guī)則,選擇并記住和當(dāng)前請求uri匹配度最長的配置項(xiàng)。但這個時候,并不會啟用相關(guān)的配置,而僅僅是記住。
三、判斷上一步中選擇下來的路徑規(guī)則是否包含 ^~ ,如果包含,則使用該條規(guī)則,終止后續(xù)匹配。
四、按配置順序進(jìn)行正則表達(dá)式檢查,匹配到第一條合適的正則表達(dá)式時,使用該條規(guī)則,終止后續(xù)匹配。
五、使用步驟三選擇出來的路徑匹配規(guī)則。

下面以實(shí)例屬性介紹:

1,不帶符號,要求必須以指定模式開始

location指令實(shí)例:

server {
    listen 8081;
    server_name 127.0.0.1;
    
   # 不帶符號,要求必須以指定模式開始(區(qū)分大小寫,并且后面帶/是有區(qū)別的)
   location /aaa {
        default_type text/plain;
        return 200 "access success aaa 

";
   }
}

# 能匹配到:
http://127.0.0.1:8081/aaa
http://127.0.0.1:8081/aaa/
http://127.0.0.1:8081/aaadef
http://127.0.0.1:8081/aaa/def/
http://127.0.0.1:8081/aaa?p1=TOM

# 不能匹配到(大小寫區(qū)分):
http://127.0.0.1:8081/Aaa

# 如果規(guī)則(后面跟/目錄符號) location /aaa/ { 則只能匹配到下面兩行:
http://127.0.0.1:8081/aaa/
http://127.0.0.1:8081/aaa/def/

如圖:
wKgZomb5CdyAOexUAABehTzGzLQ334.png

2,= 用于不包含正則表達(dá)式的uri前,必須與指定的模式精確匹配

實(shí)測,等于號后面有或沒有空格不影響效果。location指令實(shí)例:

server {
    listen 8081;
    server_name 127.0.0.1;
    
   # = : 用于不包含正則表達(dá)式的uri前,必須與指定的模式精確匹配(區(qū)分大小寫,并且后面帶/是有區(qū)別的)
   location = /bbb {
        default_type text/plain;
        return 200 "access success bbb 

";
   }

}

# 能匹配到:
http://127.0.0.1:8081/bbb
http://127.0.0.1:8081/bbb?p1=TOM

# 不能匹配到(大小寫區(qū)分):
http://127.0.0.1:8081/bbb/
http://127.0.0.1:8081/bbbcd
http://127.0.0.1:8081/Bbb

如圖:
wKgZomb5CeiAXJa_AACHwiYnVhU184.png

3,包含正則表達(dá)式的

~ :用于表示當(dāng)前uri中包含了正則表達(dá)式,并且區(qū)分大小寫
~*: 用于表示當(dāng)前uri中包含了正則表達(dá)式,并且不區(qū)分大小寫
換句話說,如果uri包含了正則表達(dá)式,需要用上述兩個符合來標(biāo)識
^~: 用于不包含正則表達(dá)式的uri前,功能和不加符號的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。(可用它提升優(yōu)先級)

含正則表達(dá)式的location指令,實(shí)例一:

server {
    listen 8081;
    server_name 127.0.0.1;

   # ~ :用于表示當(dāng)前uri中包含了正則表達(dá)式,并且區(qū)分大小寫
   # 正則表達(dá)式:區(qū)分大小寫,以/abc開頭,以1個字母或數(shù)字或下劃線或漢字結(jié)束的
   location ~^/eeew$ {
        default_type text/plain;
        return 200 "access success. 000 Regular expression matched: eee  

";
   }
}

# 能匹配到:
http://127.0.0.1:8081/eeeb
http://127.0.0.1:8081/eeeB
http://127.0.0.1:8081/eee2

# 不能匹配到(大小寫區(qū)分):
http://127.0.0.1:8081/eee
http://127.0.0.1:8081/Eee
http://127.0.0.1:8081/eee/
http://127.0.0.1:8081/eeedef
http://127.0.0.1:8081/eee/def/
http://127.0.0.1:8081/eee?p1=TOM

如圖:
wKgaomb5CfSAOia4AABWApWC5sg421.png

含正則表達(dá)式的location指令,實(shí)例二:

server {
    listen 8081;
    server_name 127.0.0.1;

   # ~*: 用于表示當(dāng)前uri中包含了正則表達(dá)式,并且不區(qū)分大小寫
   # 正則表達(dá)式:不區(qū)分大小寫,以/abc開頭,以字母或數(shù)字或下劃線或漢字結(jié)束的
   location ~*^/dddw$ {
        default_type text/plain;
        return 200 "access success. 111 Regular expression matched: ddd  

";
   }
}

# 能匹配到:
http://127.0.0.1:8081/dddb
http://127.0.0.1:8081/dddB
http://127.0.0.1:8081/ddd2
http://127.0.0.1:8081/DddH

# 不能匹配到(大小寫區(qū)分):
http://127.0.0.1:8081/ddd
http://127.0.0.1:8081/Ddd
http://127.0.0.1:8081/ddd/
http://127.0.0.1:8081/ddddef
http://127.0.0.1:8081/ddd/def/
http://127.0.0.1:8081/ddd?p1=TOM

如圖:
wKgaomb5CgOASs4mAAClwuYrXsQ879.png

不包含正則表達(dá)式的location指令,實(shí)例三:

server {
    listen 8081;
    server_name 127.0.0.1;

   # ^~: 用于不包含正則表達(dá)式的uri前,功能和不加符號的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了,可用于提升優(yōu)先級。(區(qū)分大小寫,并且后面帶/是有區(qū)別的)
   location ^~ /fff {
        default_type text/plain;
        return 200 "access success. Non Regular expression matched: fff  

";
   }
}

# 能匹配到:
http://127.0.0.1:8081/fff
http://127.0.0.1:8081/fff/
http://127.0.0.1:8081/fffdef
http://127.0.0.1:8081/fff/def/
http://127.0.0.1:8081/fff?p1=TOM

# 不能匹配到(大小寫區(qū)分):
http://127.0.0.1:8081/Fff
http://127.0.0.1:8081/pp/fff

# 如果規(guī)則(后面跟/目錄符號) location /fff/ { 則只能匹配到下面兩行:
http://127.0.0.1:8081/fff/
http://127.0.0.1:8081/fff/def/

如圖:
wKgZomb5Cg6ANZd9AACWe8uQpc0944.png

定義一個命名的 location

用"@" 定義一個命名的 location,使用在內(nèi)部定向時,例如:error_page, try_files
@location 例子:

# 示例:404錯誤頁將被內(nèi)部重定向
    error_page 404 = @fetch;
    location @fetch(
        proxy_pass http://fetch;
    )

# 類似案例:
    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

鏈接:https://www.cnblogs.com/xiongzaiqiren/p/16968651.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    577

    瀏覽量

    20485
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    143

    瀏覽量

    12163
  • 正則表達(dá)式
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    3477

原文標(biāo)題:nginx中的正則表達(dá)式和location路徑匹配指南

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是正則表達(dá)式正則表達(dá)式如何工作?哪些語法規(guī)則適用正則表達(dá)式

    正則表達(dá)式又稱規(guī)則表達(dá)式(Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),是一種用于匹配、查找、替換文本的強(qiáng)大工具。它能夠以特定的模式匹配
    的頭像 發(fā)表于 11-03 14:41 ?2945次閱讀
    什么是<b class='flag-5'>正則表達(dá)式</b>?<b class='flag-5'>正則表達(dá)式</b>如何工作?哪些語法規(guī)則適用<b class='flag-5'>正則表達(dá)式</b>?

    匹配字符串-----正則表達(dá)式的使用

    關(guān)于:匹配字符串-----正則表達(dá)式的使用和大家分享一下
    發(fā)表于 03-20 11:11

    shell正則表達(dá)式學(xué)習(xí)

    正則表達(dá)式在計(jì)算機(jī)科學(xué),是指一個用來描述或者匹配一系列符合某個句法規(guī)則的字符串的單個字符串。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來檢索和/或替換那些符合某個模式的文本內(nèi)容
    發(fā)表于 07-25 17:18

    求助,匹配正則表達(dá)式使用問題

    求助,我在使用匹配正則表達(dá)匹配visi串口傳回的數(shù)據(jù)時候,一直無法匹配成功。我懷疑是我的正則表達(dá)式
    發(fā)表于 03-29 21:19

    正則表達(dá)式在Vivado約束文件的應(yīng)用

    文件匹配目標(biāo)的時候,在可行的情況下更傾向于使用正則表達(dá)式。本文就介紹一下我常使用的正則表達(dá)式和一些在Vivado應(yīng)用的特殊之處,同時也有
    發(fā)表于 01-26 07:03

    正則表達(dá)式以及實(shí)用的匹配規(guī)則概述

    )在正則表達(dá)式,可以使用圓括號對表達(dá)式進(jìn)行分組。在匹配完成后,就可以使用分組編號來對圓括號的內(nèi)容進(jìn)行提取。默認(rèn)情況下,整個
    發(fā)表于 09-16 14:23

    正則表達(dá)式匹配

    正則表達(dá)式是描述文本模式的表示法,它可以有效地構(gòu)造一種用于模式匹配的專用語言。雖然正則表達(dá)式可以有多種不同的形式,但它們都有著共同的特點(diǎn):模式的大多數(shù)字符都
    發(fā)表于 10-29 13:21 ?0次下載

    深入淺出boost正則表達(dá)式

    什么是正則表達(dá)式正則表達(dá)式是一種用來描述一定數(shù)量文本的模式。Regex代表Regular Express. 如果您不知道什么是正則表達(dá)式,請看這篇文章:深入淺出之正則表達(dá)式
    發(fā)表于 09-08 18:09 ?9次下載

    Python正則表達(dá)式的學(xué)習(xí)指南

    本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化
    發(fā)表于 09-15 08:00 ?0次下載
    Python<b class='flag-5'>正則表達(dá)式</b>的學(xué)習(xí)<b class='flag-5'>指南</b>

    Python正則表達(dá)式指南

    本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化
    發(fā)表于 03-26 09:13 ?10次下載
    Python<b class='flag-5'>正則表達(dá)式</b><b class='flag-5'>指南</b>

    python正則表達(dá)式的常用函數(shù)

    編譯正則表達(dá)式模式,返回一個正則對象的模式。(可以把那些常用的正則表達(dá)式編譯成正則表達(dá)式對象,這樣可以提高一點(diǎn)效率。)
    的頭像 發(fā)表于 03-18 16:12 ?1772次閱讀

    Linux入門之正則表達(dá)式

    正則表達(dá)式是用來表達(dá)字符串匹配模式的方法,利用正則表達(dá)式,可以讓我們輕易地實(shí)現(xiàn)對目標(biāo)字符串的**查找**、**刪除**、**替換**等操作。
    的頭像 發(fā)表于 05-12 15:31 ?840次閱讀
    Linux入門之<b class='flag-5'>正則表達(dá)式</b>

    shell腳本基礎(chǔ):正則表達(dá)式grep

    在Linux上有許多命令可以使用正則表達(dá)式,其中最常見的是grep命令和sed命令。正則表達(dá)式有多種類型,每種類型可以使用的元字符類型不同。最常見的是基本正則表達(dá)式和擴(kuò)展
    的頭像 發(fā)表于 05-29 09:29 ?1210次閱讀
    shell腳本基礎(chǔ):<b class='flag-5'>正則表達(dá)式</b>grep

    Python正則表達(dá)式

    哈嘍大家好,我是了不起,今天給大家講Python正則表達(dá)式 在Python正則表達(dá)式是一種強(qiáng)大的文本處理工具,它可以用來匹配、搜索、
    的頭像 發(fā)表于 06-21 16:52 ?957次閱讀

    linux正則表達(dá)式匹配字符串

    在Linux操作系統(tǒng)正則表達(dá)式是一種強(qiáng)大的模式匹配工具,它可以用于在文本查找、替換和篩選特定的字符串。準(zhǔn)確掌握正則表達(dá)式的語法和常見應(yīng)
    的頭像 發(fā)表于 11-23 10:26 ?698次閱讀