您好,登錄后才能下訂單哦!
這篇文章主要介紹了Nginx如何實(shí)現(xiàn)URL重寫規(guī)則配置,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
rewrite模塊介紹
nginx的重寫模塊是一個(gè)簡(jiǎn)單的正則表達(dá)式匹配與一個(gè)虛擬堆疊機(jī)結(jié)合。依賴于PCRE庫(kù),因此需要安裝pcre。根據(jù)相關(guān)變量重定向和選擇不同的配置,從一個(gè)location跳轉(zhuǎn)到另一個(gè)location,不過(guò)這樣的循環(huán)最多可以執(zhí)行10次,超過(guò)后nginx將返回500錯(cuò)誤。同時(shí),重寫模塊包含set指令,來(lái)創(chuàng)建新的變量并設(shè)其值,這在有些情景下非常有用的,如記錄條件標(biāo)識(shí)、傳遞參數(shù)到其他location、記錄做了什么等等。
rewrite模塊指令
break
語(yǔ)法:break 默認(rèn)值:none 使用字段:server, location, if
作用:完成當(dāng)前設(shè)置的重寫規(guī)則,停止執(zhí)行其他的重寫規(guī)則。
if
語(yǔ)法:if (condition) { … } 默認(rèn)值:none 使用字段:server, location
注意:盡量考慮使用trp_files代替。
判斷的條件可以有以下值:
一個(gè)變量的名稱:空字符傳”“或者一些“0”開(kāi)始的字符串為false。 字符串比較:使用=或!=運(yùn)算符 正則表達(dá)式匹配:使用~(區(qū)分大小寫)和~(不區(qū)分大小寫),取反運(yùn)算!~ 和!~。 文件是否存在:使用-f和!-f操作符 目錄是否存在:使用-d和!-d操作符 文件、目錄、符號(hào)鏈接是否存在:使用-e和!-e操作符 文件是否可執(zhí)行:使用-x和!-x操作符
return
語(yǔ)法:return code 默認(rèn)值:none 使用字段:server, location, if
停止處理并為客戶端返回狀態(tài)碼。非標(biāo)準(zhǔn)的444狀態(tài)碼將關(guān)閉連接,不發(fā)送任何響應(yīng)頭??梢允褂玫臓顟B(tài)碼有:204,400,402-406,408,410, 411, 413, 416與500-504。如果狀態(tài)碼附帶文字段落,該文本將被放置在響應(yīng)主體。相反,如果狀態(tài)碼后面是一個(gè)URL,該URL將成為location頭補(bǔ)值。沒(méi)有狀態(tài)碼的URL將被視為一個(gè)302狀態(tài)碼。
rewrite
語(yǔ)法:rewrite regex replacement flag 默認(rèn)值:none 使用字段:server, location, if
按照相關(guān)的正則表達(dá)式與字符串修改URI,指令按照在配置文件中出現(xiàn)的順序執(zhí)行??梢栽谥貙懼噶詈竺嫣砑訕?biāo)記。
注意:如果替換的字符串以http://開(kāi)頭,請(qǐng)求將被重定向,并且不再執(zhí)行多余的rewrite指令。
尾部的標(biāo)記(flag)可以是以下的值:
last – 停止處理重寫模塊指令,之后搜索location與更改后的URI匹配。 break – 完成重寫指令。 redirect – 返回302臨時(shí)重定向,如果替換字段用http://開(kāi)頭則被使用。 permanent – 返回301永久重定向。
rewrite_log
語(yǔ)法:rewrite_log on | off 默認(rèn)值:rewrite_log off 使用字段:server, location, if 變量:無(wú)
啟用時(shí)將在error log中記錄notice級(jí)別的重寫日志。
set
語(yǔ)法:set variable value 默認(rèn)值:none 使用字段:server, location, if
為給定的變量設(shè)置一個(gè)特定值。
uninitialized_variable_warn
語(yǔ)法:uninitialized_variable_warn on|off 默認(rèn)值:uninitialized_variable_warn on 使用字段:http, server, location, if
控制是否記錄未初始化變量的警告信息。
重寫規(guī)則組成部分
第一部分–正則表達(dá)式
可以使用括號(hào)來(lái)捕獲,后續(xù)可以根據(jù)位置來(lái)將其引用,位置變量值取決于捕獲正則表達(dá)式中的順序,$1引用第一個(gè)括號(hào)中的值,$2引用第二個(gè)括號(hào)中的值,以此類推。如:
^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$ # $1是兩個(gè)小寫字母組成的字符串 # $2是由小寫字母和0到9的數(shù)字組成的5個(gè)字符的字符串 # $3將是個(gè)文件名 # $4是png、jpg、gif中的其中一個(gè)。
第二部分–URI
請(qǐng)求被改寫。該URI可能包含正則表達(dá)式中的捕獲的位置參數(shù)或這個(gè)級(jí)別下的nginx任何配置變量。如:
/data?file=$3.$4
如果這個(gè)URI不匹配nginx配置的任何location,那么將給客戶端返回301(永久重定向)或302(臨時(shí)重定向)的狀態(tài)碼來(lái)表示重定向類型。該狀態(tài)碼可以通過(guò)第三個(gè)參數(shù)來(lái)明確指定。
第三部分–標(biāo)記
第三部分也就是尾部的標(biāo)記(flag)。 last標(biāo)記將導(dǎo)致重寫后的URI搜索匹配nginx的其他location,最多可循環(huán)10次。如:
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;
break指令可以當(dāng)做自身指令。如:
if ($bwhog) { limit_rate 300k; break; }
實(shí)例
http { #定義image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 開(kāi)啟重寫日志 rewrite_log on; server { root /home/www; location / { # 重寫規(guī)則信息 error_log logs/rewrite.log notice; # 注意這里要用‘’單引號(hào)引起來(lái),避免{} rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面這條規(guī)則后面加上“l(fā)ast”參數(shù),否則下面的set指令不會(huì)執(zhí)行 set $image_file $3; set $image_type $4; } location /data { # 指定針對(duì)圖片的日志格式,來(lái)分析圖片類型和大小 access_log logs/images.log mian; root /data/images; # 應(yīng)用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉(zhuǎn)到最后一個(gè)url里 try_files /$arg_file /image404.html; } location = /image404.html { # 圖片不存在返回特定的信息 return 404 "image not found\n"; } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Nginx如何實(shí)現(xiàn)URL重寫規(guī)則配置”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。