本文提供一些常用的rewrite重寫規(guī)則,用來(lái)美化網(wǎng)頁(yè)的鏈接。規(guī)則里面的$1$2你不知道是怎么來(lái)的話,只要記住,第一個(gè)()里面的是$1,第二個(gè)()里面的是$2.
請(qǐng)求的URL是給人看的,重寫后的URL是給電腦看的。
執(zhí)行搜索
這個(gè)規(guī)則的目的是為了執(zhí)行搜索,搜索URL中包含的關(guān)鍵字。
請(qǐng)求的URL //hqidi.com/search/some-search-keywords
重寫后URL //hqidi.com/search.php?p=some-search-keywords
重寫規(guī)則 rewrite ^/search/(.*)$ /search.php?p=$1?;
用戶個(gè)人資料頁(yè)面
大多數(shù)運(yùn)行訪問(wèn)者注冊(cè)的動(dòng)態(tài)網(wǎng)站都提供一個(gè)可以查看個(gè)人資料的頁(yè)面,這個(gè)頁(yè)面的URL包含用戶的UID和用戶名
請(qǐng)求的URL //hqidi.com/user/47/dige
重寫后URL //hqidi.com/user.php?id=47&name=dige
重寫規(guī)則 rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;
多個(gè)參數(shù)
有些網(wǎng)站對(duì)字符串參數(shù)使用不同的語(yǔ)法,例如 通過(guò)斜線“/”來(lái)分隔非命名參數(shù)
請(qǐng)求的URL //hqidi.com/index.php/param1/param2/param3
重寫后URL //hqidi.com/index.php?p1=param1&p2=param2&p3=param3
重寫規(guī)則 rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;
類似百科的格式
這種格式特點(diǎn),一個(gè)前綴目錄,后跟文章名稱
請(qǐng)求的URL //hqidi.com/wiki/some-keywords
重寫后URL //hqidi.com/wiki/index.php?title=some-keywords
重寫規(guī)則 rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;
論壇
論壇一般用到兩個(gè)參數(shù),一個(gè)話題標(biāo)識(shí)(topic)一個(gè)出發(fā)點(diǎn)(starting post)
請(qǐng)求的URL //hqidi.com/topic-1234-50-some-keywords.html
重寫后URL //hqidi.com/viewtopic.php?topic=1234&start=50
重寫規(guī)則 rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)/.html$ viewtopic.php?topic=$1&start=$2?;
新網(wǎng)站的文章
這種URL結(jié)構(gòu)的特點(diǎn),由一個(gè)文章標(biāo)識(shí)符,后跟一個(gè)斜線,和一個(gè)關(guān)鍵字列表組成。
請(qǐng)求的URL //hqidi.com/88/future
重寫后URL //hqidi.com/atricle.php?id=88
重寫規(guī)則 rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;
最后一個(gè)問(wèn)號(hào)
若被替換的URI中含有參數(shù)(類似/app/test.php?id=5之類的URI),默認(rèn)情況下參數(shù)會(huì)被自動(dòng)附加到替換串上,可以通過(guò)在替換串的末尾加上?標(biāo)記來(lái)解決這一問(wèn)題。
rewrite ^/users/(.*)$ /show?user=$1? last;
比較一個(gè)加上?標(biāo)記和不加?標(biāo)記的URL跳轉(zhuǎn)區(qū)別:
rewrite ^/test(.*)$ //hqidi.com/home premanent;
訪問(wèn)//hqidi.com/test?id=5 經(jīng)過(guò)301跳轉(zhuǎn)后的URL地址為 //hqidi.com/home?id=5
rewrite ^/test(.*)$ //hqidi.com/home? premanent;
訪問(wèn)//hqidi.com/test?id=5 經(jīng)過(guò)301跳轉(zhuǎn)后的URL地址為 //hqidi.com/home
Nginx的rewrite功能需要PCRE軟件的支持,即通過(guò)perl兼容正則表達(dá)式語(yǔ)句進(jìn)行規(guī)則匹配的。默認(rèn)參數(shù)編譯nginx就會(huì)支持rewrite的模塊,但是也必須要PCRE的支持
rewrite是實(shí)現(xiàn)URL重寫的關(guān)鍵指令,根據(jù)regex(正則表達(dá)式)部分內(nèi)容,重定向到replacement,結(jié)尾是flag標(biāo)記。
nginx rewrite指令執(zhí)行順序
1.執(zhí)行server塊的rewrite指令(這里的塊指的是server關(guān)鍵字后{}包圍的區(qū)域,其它xx塊類似)
2.執(zhí)行l(wèi)ocation匹配
3.執(zhí)行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環(huán)執(zhí)行1-3,直到找到真實(shí)存在的文件。
如果循環(huán)超過(guò)10次,則返回500 Internal Server Error錯(cuò)誤。
flag標(biāo)志位
rewrite的語(yǔ)法很簡(jiǎn)單,如:
rewrite regex URL [flag];
rewrite是關(guān)鍵字,regex是正則表達(dá)式,URL是要替代的內(nèi)容,[flag]是標(biāo)記位的意思,它有以下幾種值:
因?yàn)?01和302不能簡(jiǎn)單的只返回狀態(tài)碼,還必須有重定向的URL,這就是return指令無(wú)法返回301,302的原因了。這里 last 和 break 區(qū)別有點(diǎn)難以理解:
來(lái)看一個(gè)簡(jiǎn)單實(shí)例:
rewrite ^/listings/(.*)$ /listing.html?listing=$1 last;rewrite ^/images/(.*)_(/d+)x(/d+)/.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
第一條重寫規(guī)則中,我們可以使用友好的URL:http://mysite.com/listings/123代替http://mysite.com/listing.html?listing=123,就相當(dāng)于我們?cè)跒g覽器的地址欄中輸入http://mysite.com/listings/123后,實(shí)際訪問(wèn)的URL資源是http://mysite.com/listing.html?listing=123。
第二條規(guī)則中,對(duì)形如http://mysite.com/images/bla_500x400.jpg的文件請(qǐng)求,重寫到http://mysite.com/resizer/bla.jpg?width=500&height=400地址,并會(huì)繼續(xù)嘗試匹配location。
if指令與全局變量
if指令語(yǔ)法為if(condition){...},對(duì)給定的條件condition進(jìn)行判斷。如果為真,大括號(hào)內(nèi)的rewrite指令將被執(zhí)行。
來(lái)看代碼規(guī)則:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break;} //如果UA包含"MSIE",rewrite請(qǐng)求到/msid/目錄下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } //如果cookie匹配正則,設(shè)置變量$id等于正則引用部分 if ($request_method = POST) { return 405;} //如果提交方法為POST,則返回狀態(tài)405(Method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k;} //限速,$slow可以通過(guò) set 指令設(shè)置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果請(qǐng)求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查 if ($args ~ post=140){ rewrite ^ http://mysite.com/ permanent;} //如果query string中包含"post=140",永久重定向到mysite.com
if指令中,可以使用全局變量,這些變量有:
使用return跳轉(zhuǎn)
我們有時(shí)需要在Nginx上使用rewrite做301地址跳轉(zhuǎn),比如以下規(guī)則:
rewrite ^ $scheme://www.mysite.com$request_uri permanent;
當(dāng)訪問(wèn)任意url都會(huì)301永久定向到www.mysite.com的url上。這個(gè)寫法沒(méi)錯(cuò),但是因?yàn)槭褂昧藃ewrite的正則匹配,會(huì)損耗一部分資源,nginx官網(wǎng)不推薦這樣寫。我們可以使用return同樣可以實(shí)現(xiàn)301跳轉(zhuǎn),簡(jiǎn)單實(shí)用,看實(shí)例:
301永久定向到新域名
server { listen 80; listen 443 ssl; server_name www.old-name.com old-name.com; return 301 $scheme://www.new-name.com;}
以上代碼實(shí)現(xiàn)了老域名301跳轉(zhuǎn)到新域名上,假如網(wǎng)站要更換新域名的話使用此方法做301跳轉(zhuǎn)。
不帶www的域名301跳轉(zhuǎn)到帶www的域名
server { listen 80; listen 443 ssl; server_name mysite.com; return 301 $scheme://www.mysite.com$request_uri;}
http站點(diǎn)301跳轉(zhuǎn)到https站點(diǎn)
server { listen 80; server_name www.mysite.com; return 301 https://www.mysite.com$request_uri;}
以上就是有關(guān)Nginx的rewrite重寫與重定向的介紹,覺(jué)得有用就請(qǐng)練習(xí)多遍,收藏好此文不迷路。也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選