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