柚子快報(bào)邀請(qǐng)碼778899分享:正則表達(dá)式
柚子快報(bào)邀請(qǐng)碼778899分享:正則表達(dá)式
Nginx正則表達(dá)式
常用正則表達(dá)式元字符
匹配輸入字符串的起始位置
示例:^hello 匹配以 "hello" 開(kāi)頭的字符串, 示例:^/(user|profile): 匹配以 "/user" 或 "/profile" 開(kāi)頭的 URI。 $:匹配輸入字符串的結(jié)束位置
示例:world$ 匹配以 "world" 結(jié)尾的字符串 *:匹配前面的字符零次或多次
示例:colou*r 匹配 "color" 或 "colour" +:匹配前面的字符一次或多次
示例:go+l 匹配 "gol", "gool", "gooool", 等等 ?:匹配前面的字符零次或一次
示例:apple(s)? 匹配 "apple" 或 "apples" .:匹配除 "\n" 之外的任何單個(gè)字符
示例:b.t 匹配 "bat", "but", "b@t", 等等 \:將后面接著的字符標(biāo)記為一個(gè)特殊字符
示例:\.jpg$: 匹配以 ".jpg" 結(jié)尾的 URI。 示例:\d+ 匹配一個(gè)或多個(gè)數(shù)字 {n}:重復(fù) n 次
示例:a{3} 匹配 "aaa" {n,}:重復(fù) n 次或更多次
示例:b{2,} 匹配 "bb", "bbb", "bbbb", 等等 {n,m}:重復(fù) n 到 m 次
示例:c{2,4} 匹配 "cc", "ccc", "cccc" []:定義匹配的字符范圍
示例:[aeiou] 匹配任何一個(gè)元音字母 示例:[0-9] 匹配任何一個(gè)數(shù)字 [c]:匹配單個(gè)字符 c
示例:[abc] 匹配 "a", "b", 或 "c" [a-z]:匹配 a-z 小寫字母的任意一個(gè)
示例:[a-z] 匹配任何一個(gè)小寫字母 [a-zA-Z0-9]:匹配所有大小寫字母或數(shù)字
示例:[a-zA-Z0-9] 匹配任何一個(gè)大小寫字母或數(shù)字 ():表達(dá)式的開(kāi)始和結(jié)束位置
示例:(abc) 匹配 "abc" |:或運(yùn)算符
示例:cat|dog 匹配 "cat" 或 "dog" 這些正則表達(dá)式可用于識(shí)別特定的 URL 模式,并據(jù)此進(jìn)行重定向或其他操作。
Nginx Location基本操作
在 Nginx 配置中,location 主要分為三類:精確匹配、前綴匹配和正則表達(dá)式匹配。
精確匹配:指定完整的 URI 進(jìn)行匹配。location = / {...} 前綴匹配:指定 URI 的前綴進(jìn)行匹配。location / {...} 正則表達(dá)式匹配:使用正則表達(dá)式進(jìn)行匹配。正則匹配:location ~ / {...}
location = /about { ? ? # 精確匹配 } ? location /blog/ { ? ? # 前綴匹配 } ? location ~* \.(gif|jpg|jpeg)$ { ? ? # 正則表達(dá)式匹配 }
Location 常用的匹配規(guī)則
在 location 中,有一些常用的匹配規(guī)則,例如:
=: 精確匹配。也就是完全匹配 ^~: 前綴匹配,如果匹配成功,停止搜索其他 location。 ~ 和 ~*: 區(qū)分大小寫和不區(qū)分大小寫的正則表達(dá)式匹配。 !~ :區(qū)分大小寫的匹配取非。!~* :不區(qū)分大小寫的匹配取非。 這些匹配規(guī)則決定了如何匹配 URI,并且影響著 location 的優(yōu)先級(jí)
Location 優(yōu)先級(jí)
在 Nginx 中,location 的優(yōu)先級(jí)遵循“先精確匹配,再前綴匹配,最后正則表達(dá)式匹配”的原則。這意味著精確匹配的 location 會(huì)優(yōu)先匹配,其次是前綴匹配,最后是正則表達(dá)式匹配。
Location 示例說(shuō)明
location = /about { # 精確匹配 } ? location /blog/ { # 前綴匹配 } ? location ~* \.(gif|jpg|jpeg)$ { # 正則表達(dá)式匹配 }
當(dāng)請(qǐng)求 URI 為 "/about" 時(shí),將匹配第一個(gè)規(guī)則,因?yàn)樗蔷_匹配。請(qǐng)求 URI 為 "/blog/some-article" 時(shí),將匹配第二個(gè)規(guī)則,因?yàn)樗乔熬Y匹配。而請(qǐng)求 URI 為 "/image.jpg" 時(shí),將匹配第三個(gè)規(guī)則,因?yàn)樗钦齽t表達(dá)式匹配。
location = / {
# 這里匹配根目錄的請(qǐng)求,不包括任何額外的路徑
# =為精確匹配 / ,主機(jī)名后面不能帶任何字符串,比如訪問(wèn) / 和 /data,則 / 匹配,/data 不匹配
再比如 location = /abc,則只匹配/abc ,/abc/或 /abcd不匹配
}
location /user/ {
# 匹配以 /user/ 開(kāi)頭的所有請(qǐng)求,比如 /user/profile、/user/settings 等
# 匹配任何以 /user/ 開(kāi)頭的地址,匹配符合以后,還要繼續(xù)往下搜索其它 location
只有其它 location后面的正則表達(dá)式?jīng)]有匹配到時(shí),才會(huì)采用這一條
}
location ~* \.(css|js)$ {
# 匹配所有以 .css 或 .js 結(jié)尾的請(qǐng)求,不區(qū)分大小寫
}
location ^~ /admin {
# 匹配以 /admin 開(kāi)頭的請(qǐng)求,并且停止匹配其它正則規(guī)則
}
location ~ ^/article/(\d+) {
# 匹配類似 /article/123、/article/456 這樣的數(shù)字結(jié)尾的請(qǐng)求
}
Location 匹配順序
在 Nginx 中,location 的匹配順序非常重要。通常情況下,應(yīng)該按照從精確匹配到前綴匹配再到正則表達(dá)式匹配的順序進(jìn)行配置,以確保匹配的準(zhǔn)確性。
三個(gè)匹配規(guī)則定義
直接匹配網(wǎng)站根
第一個(gè)必選規(guī)則直接匹配網(wǎng)站根,通過(guò)域名訪問(wèn)網(wǎng)站首頁(yè)比較頻繁,使用這個(gè)會(huì)加速處理,比如說(shuō)官網(wǎng),可以是一個(gè)靜態(tài)首頁(yè),也可以直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器
對(duì)于直接匹配網(wǎng)站根的需求,可以使用如下配置:
location = / { # 處理根目錄請(qǐng)求? ? ? root ? html; ? ??? ?index ?index.html index.htm; }
處理靜態(tài)文件請(qǐng)求
第二個(gè)必選規(guī)則是處理靜態(tài)文件請(qǐng)求,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng)有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
靜態(tài)文件通常位于特定的目錄中,可以使用前綴匹配來(lái)處理靜態(tài)文件請(qǐng)求:
目錄匹配:
location /static/ {
# 處理靜態(tài)文件請(qǐng)求
root /usr/share/nginx/html/;
index index.html index.htm;
try_files $uri $uri/ /dp/index.html = systemUpdate;
}
后綴匹配:
location ~* \.(xlsx|jpg)$ {
# 處理特定類型的請(qǐng)求
root /usr/share/nginx/html/file;
}
通用規(guī)則
第三個(gè)規(guī)則就是通用規(guī)則,比如用來(lái)轉(zhuǎn)發(fā)帶.php、.jsp后綴的動(dòng)態(tài)請(qǐng)求到后端應(yīng)用服務(wù)器 非靜態(tài)文件請(qǐng)求就默認(rèn)是動(dòng)態(tài)請(qǐng)求
location / {
proxy_pass http://127.0.0.1:8080;
}
Nginx Rewrite基本操作
rewrite 功能是利用 Nginx 提供的全局變量或自定義變量,結(jié)合正則表達(dá)式和標(biāo)志位來(lái)實(shí)現(xiàn) URL 的重寫和重定向。它通常用于處理域名更換后的跳轉(zhuǎn)、頁(yè)面地址變更的重定向、網(wǎng)站防盜鏈等需求。
rewrite 指令可以放置在 server、location 和 if 塊中,它默認(rèn)只對(duì)域名后面除了傳遞的參數(shù)之外的字符串進(jìn)行匹配重寫。比如,對(duì)于 URL http://www.baidu.com/abc/bbs/index.php?a=1&b=2,rewrite 只會(huì)對(duì) /abc/bbs/index.php 部分進(jìn)行重寫。
?rewrite 跳轉(zhuǎn)實(shí)現(xiàn)
使用 rewrite 可以對(duì) URL 進(jìn)行重定向或重寫,常用于實(shí)現(xiàn)網(wǎng)站 URL 的美化、重定向等功能。
Nginx 通過(guò) ngx_http_rewrite_module 模塊支持 URL 重寫,它也支持 if 條件判斷,但不支持 else。在進(jìn)行跳轉(zhuǎn)時(shí),從一個(gè) location 跳轉(zhuǎn)到另一個(gè) location,但最多只能執(zhí)行 10 次跳轉(zhuǎn),否則 Nginx 將返回 500 錯(cuò)誤。使用 PCRE 語(yǔ)法規(guī)則進(jìn)行匹配,并通過(guò)重寫模塊的 set 指令創(chuàng)建新的變量并設(shè)置其值
rewrite 執(zhí)行順序
ewrite 指令按照配置文件中的先后順序執(zhí)行,匹配成功后會(huì)立即執(zhí)行相應(yīng)的重定向或重寫操作。
執(zhí)行 server 塊內(nèi)的 rewrite 指令。進(jìn)行 location 匹配。在選定的 location 中執(zhí)行 rewrite 指令
flag 標(biāo)記說(shuō)明 last:本條規(guī)則匹配完成后,繼續(xù)向下匹配新的 location URL 規(guī)則,一般用于 server 和 if 塊中。 break:本條規(guī)則匹配完成后立即終止,不再匹配后續(xù)的任何規(guī)則,一般用于 location 塊中。 redirect:返回 302 臨時(shí)重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的 URL 地址。 permanent:返回 301 永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的 URL 地址。
rewrite 和 location 區(qū)別
rewrite 和 location 在功能上有些相似,都能實(shí)現(xiàn)跳轉(zhuǎn),但主要區(qū)別在于:
rewrite 用于在同一域名內(nèi)更改獲取資源的路徑。location 用于對(duì)一類路徑進(jìn)行訪問(wèn)控制或反向代理,也可以用proxy_pass將請(qǐng)求代理到其他機(jī)器。
Nginx Rewrite?示例
現(xiàn)在公司舊域名www.tong.com有業(yè)務(wù)需求變更,需要使用新域名www.ctt.com代替,但是舊域名不能廢除,需要跳轉(zhuǎn)到新域名上,而且后面的參數(shù)保持不
vim /usr/local/nginx/conf/nginx.conf #編輯nginx配置文件
server {
listen 80;
server_name www.tong.com; #域名修改
charset utf-8;
access_log /var/log/nginx/access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.tong.com'){ #$host為rewrite全局變量,代表請(qǐng)求主機(jī)頭字段或主機(jī)名
rewrite ^/(.*)$ http://www.ctt.com/$1 permanent; #$1為正則匹配的內(nèi)容,即“域名/”之后的字符串
}
root html;
index index.html index.htm;
}
}
echo "192.168.80.20 www.tong.com www.ctt.com" >> /etc/hosts ? ?#修改本地host映射
#創(chuàng)建test/1.html
cd /usr/local/nginx/html
mkdir test #創(chuàng)建目錄
echo "測(cè)試web1" > test/1.html
systemctl restart nginx #重啟nginx服務(wù)
瀏覽器輸入模擬訪問(wèn) http://www.tong.com/test/1.html(雖然這個(gè)請(qǐng)求內(nèi)容是不存在的)
會(huì)跳轉(zhuǎn)到www.ctt.com/test/1.html,查看元素可以看到返回301,實(shí)現(xiàn)了永久重定向跳轉(zhuǎn),而且域名后的參數(shù)也正常跳轉(zhuǎn)。
基于客戶端 IP 訪問(wèn)跳轉(zhuǎn)
server {
listen 80;
server_name www.tong.com; #域名修改
charset utf-8;
access_log /var/log/nginx/access.log; #日志修改
#設(shè)置是否合法的IP標(biāo)記
set $rewrite true; #設(shè)置變量$rewrite,變量值為boole值true
#判斷是否為合法IP
#remode_addr表示客戶端
if ($remote_addr = "192.168.80.20"){ #當(dāng)客戶端IP為192.168.80.20時(shí),將變量值設(shè)為false,不進(jìn)行重寫
set $rewrite false;
}
#除了合法IP,其它都是非法IP,進(jìn)行重寫跳轉(zhuǎn)維護(hù)頁(yè)面
if ($rewrite = true){ #當(dāng)變量值為true時(shí),進(jìn)行重寫
rewrite (.+) /web.html; #將域名后邊的路徑重寫成/web.html,例如www.tong.com/web.html
}
location = /web.html {
root /var/www/html; #網(wǎng)頁(yè)返回/var/www/html/web.html的內(nèi)容
}
location / {
root html;
index index.html index.htm;
}
}
柚子快報(bào)邀請(qǐng)碼778899分享:正則表達(dá)式
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。