作者:燁竹
簡單理解
URL重寫就是首先獲得一個進入的URL請求然后把它重新寫成網(wǎng)站可以處理的另一個URL的過程
優(yōu)點
⒈縮短url丸冕,隱藏實際路徑提高安全性靖诗。
⒉易于用戶記憶和鍵入。
⒊易于被搜索引擎收錄
根據(jù)不同的服務(wù)器就會有不同的URL重寫規(guī)則
比如 iis apache nginx 這三種重寫方式都是不同的静檬,并非完全一樣的;下面分別介紹三種服務(wù)器的url重寫實現(xiàn)
重寫偽靜態(tài)規(guī)則轉(zhuǎn)換工具v6.0
URL重寫工具
所以只要學(xué)會apache的規(guī)則就可以解決大部分問題了
apache實現(xiàn)
基于服務(wù)器級(httpd.conf)相當于中控
1.apache的安裝目錄下的conf下的httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so去掉#
2.vhosts.conf
AllowOverride None改為 AllowOverride All
基于目錄級.htaccess
首先了解.htaccess
.htaccess是Apache服務(wù)器中的一個配置文件宽档,它負責(zé)相關(guān)目錄下的網(wǎng)頁配置尉姨,能夠?qū)崿F(xiàn):網(wǎng)頁301重定向、自定義404錯誤頁面吗冤、改變文件擴展名又厉、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表椎瘟、配置默認文檔等功能
.htaccess首先是基于httpd.conf來實現(xiàn)的覆致,所以啟用.htaccess,需要修改httpd.conf肺蔚,啟用AllowOverride煌妈,并可以用AllowOverride限制特定命令的使用,如果需要使用.htaccess以外的其他文件名宣羊,可以用AccessFileName指令來改變璧诵;
例如,需要使用.config 仇冯,則可以在服務(wù)器配置文件中按以下方法配置:AccessFileName .config
.htaccess文件中的配置指令作用域:.htaccess文件所在的目錄及其所有子目錄
htaccess語法
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1
# 沒有輸入文件名的默認到到首頁
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteRule ^(/)?$ blog/index.php [L]
【RewriteEngine On】重寫引擎開關(guān)之宿;作用就是是否開啟或關(guān)閉以下的語句;
【RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】:如果訪問的網(wǎng)址是xxx.com或者 www.xxx.com就執(zhí)行以下的語句苛坚,不符合就跳過
RewriteCond: 重寫條件
%{HTTP_HOST} :前綴部分(www.xxx.com不包括“http://”和“/”)
正則表達式的寫法:^表示 字符串開始比被,$表示字符串結(jié)尾,.表示轉(zhuǎn)義的
?表示前面括號www.出現(xiàn)0次或1次
【RewriteCond %{REQUEST_URI} !^/blog/】訪問的地址不以/blog/開頭
%{REQUEST_URI}:表示訪問的相對地址泼舱,就是相對根目錄的地址
!表示非姐赡;只是開頭^;沒有結(jié)尾$
【RewriteCond %{REQUEST_FILENAME} !-f】
【RewriteCond %{REQUEST_FILENAME} !-d】
請求的文件或路徑是不存在的柠掂,如果文件或路徑存在將返回已經(jīng)存在的文件或路徑
【RewriteRule ^(.)$ /blog/$1】重寫規(guī)則:當上面的RewriteCond條件都滿足的時候,將會執(zhí)行此重寫規(guī)則依沮;
正則表達式:^(.)$意思是匹配當前URL任意字符涯贞,'.'表示任意單個字符枪狂,*表示匹配0次或N次(N>0)
/blog/$1:重寫成分,意思是將前面匹配的字符重寫成/blog/$1宋渔,這個$1表示反向匹配州疾,引用的是前面第一個圓括號的成分
【RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】
【RewriteRule ^(/)?$ blog/index.php [L]】
host地址是www.xxx.com或者xxx.com,如果地址的結(jié)尾只有0個或者1個“/”時皇拣,將會重寫到子目錄下的主頁 blog/index.php
linux系統(tǒng)是區(qū)分大小寫的严蓖,所以應(yīng)該在RewriteCond后添加[NC]忽略大小寫的
[L]:表示最后一條語句的意思
linux下的寫法:
RewriteEngine On
RewiteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blog/$1
# 沒有輸入文件名的默認到到首頁
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteRule ^(/)?$ blog/index.php [L]
RewiteBase /
RewriteRule ^(.)$ /blog/$1 前部分 ^(.)$ 將會匹配當前請求的url
網(wǎng)址是http://www.xxx.com/a.html,到底是匹配整個http://www.xxx.com/a.html氧急,還是只匹配/a.html即反斜杠后面的成分颗胡,還是只匹配a.html
根據(jù)RewriteBase規(guī)則規(guī)定,如果rewritebase 為/吩坝,將會匹配a.html
/error/daolian.gif為別人盜鏈時顯示的圖片
RewriteEngine on
RewiteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !xxx.info [NC]
RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
【RewriteCond語法】
rewritecond的其他用法:
"-d"(目錄)
將TestString視為一個路徑名并測試它是否為一個存在的目錄毒姨。
"-f"(常規(guī)文件)
將TestString視為一個路徑名并測試它是否為一個存在的常規(guī)文件。
"-s"(非空的常規(guī)文件)
將TestString視為一個路徑名并測試它是否為一個存在的钉寝、尺寸大于0的常規(guī)文件弧呐。
"-l"(符號連接)
將TestString視為一個路徑名并測試它是否為一個存在的符號連接。
"-x"(可執(zhí)行)
將TestString視為一個路徑名并測試它是否為一個存在的嵌纲、具有可執(zhí)行權(quán)限的文件俘枫。該權(quán)限由操作系統(tǒng)檢測。
"-F"(對子請求存在的文件)
檢查TestString是否為一個有效的文件逮走,而且可以在服務(wù)器當前的訪問控制配置下被訪問鸠蚪。它使用一個內(nèi)部子請求來做檢查,由于會降低服務(wù)器的性能言沐,所以請謹慎使用邓嘹!
"-U"(對子請求存在的URL)
檢查TestString是否為一個有效的URL,而且可以在服務(wù)器當前的訪問控制配置下被訪問险胰。它使用一個內(nèi)部子請求來做檢查汹押,由于會降低服務(wù)器的性能,所以請謹慎使用起便!
【RewriteRule語法:】
"chain|C"(鏈接下一規(guī)則)
此標記使當前規(guī)則與下一個規(guī)則相鏈接棚贾。它產(chǎn)生這樣的效果:如果一個規(guī)則被匹配,則繼續(xù)處理其后繼規(guī)則榆综,也就是這個標記不起作用妙痹;如果該規(guī)則不被匹配,則其后繼規(guī)則將被跳過鼻疮。比如怯伊,在一個目錄級規(guī)則中執(zhí)行一個外部重定向時,你可能需要刪除”.www”(此處不應(yīng)該出現(xiàn)”.www”)
"cookie|CO=NAME:VAL:domain[:lifetime[:path]]"(設(shè)置cookie)
在客戶端設(shè)置一個cookie判沟。cookie的名稱是NAME耿芹,值是VAL崭篡。domain是該cookie的域,比如".apache.org"吧秕,可選的lifetime是cookie的有效期(分鐘)琉闪,可選的path是cookie的路徑
"env|E=VAR:VAL"(設(shè)置環(huán)境變量)
此標記將環(huán)境變量VAR的值為VAL,VAL可以包含可擴展的正則表達式反向引用($N和%N)砸彬。此標記可以多次使用以設(shè)置多個變量颠毙。這些變量可以在其后許多情況下被間接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{"VAR"})中砂碉,也可以在后繼的RewriteCond指令的CondPattern參數(shù)中通過%{ENV:VAR}引用蛀蜜。使用它可以記住從URL中剝離的信息
"forbidden|F"(強制禁止URL)
強制禁止當前URL,也就是立即反饋一個HTTP響應(yīng)碼403(被禁止的)绽淘。使用這個標記涵防,可以鏈接若干個RewriteConds來有條件地阻塞某些URL
"gone|G"(強制廢棄URL)
強制當前URL為已廢棄,也就是立即反饋一個HTTP響應(yīng)碼410(已廢棄的)沪铭。使用這個標記壮池,可以標明頁面已經(jīng)被廢棄而不存在了
"handler|H=Content-handler"(強制指定內(nèi)容處理器)
強自制定目標文件的內(nèi)容處理器為Content-handler。例如杀怠,用來模擬mod_alias模塊的ScriptAlias指令椰憋,以強制映射文件夾內(nèi)的所有文件都由”cgi-script”處理器處理
"last|L"(結(jié)尾規(guī)則)
立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則赔退。它對應(yīng)于Perl中的last命令或C語言中的break命令橙依。這個標記用于阻止當前已被重寫的URL被后繼規(guī)則再次重寫。例如硕旗,使用它可以重寫根路徑的URL("/")為實際存在的URL(比如:"/e/www/")
"next|N"(從頭再來)
重新執(zhí)行重寫操作(從第一個規(guī)則重新開始)窗骑。此時再次進行處理的URL已經(jīng)不是原始的URL了,而是經(jīng)最后一個重寫規(guī)則處理過的URL漆枚。它對應(yīng)于Perl中的next命令或C語言中的continue命令创译。此標記可以重新開始重寫操作(立即回到循環(huán)的開頭)。但是要小心墙基,不要制造死循環(huán)
"nocase|NC"(忽略大小寫)
它使Pattern忽略大小寫软族,也就是在Pattern與當前URL匹配時,"A-Z"和"a-z"沒有區(qū)別
"noescape|NE"(在輸出中不對URI進行轉(zhuǎn)義)
此標記阻止mod_rewrite對重寫結(jié)果應(yīng)用常規(guī)的URI轉(zhuǎn)義規(guī)則残制。 一般情況下立砸,特殊字符("%", "$", ";"等)會被轉(zhuǎn)義為等值的十六進制編碼("%25′, "%24′, "%3B"等)。此標記可以阻止這樣的轉(zhuǎn)義初茶,以允許百分號等符號出現(xiàn)在輸出中颗祝,比如:
RewriteRule /foo/(.) /bar?arg=P1%3d$1 [R,NE]
可以使"/foo/zed轉(zhuǎn)向到一個安全的請求"/bar?arg=P1=zed"
"nosubreq|NS"(不對內(nèi)部子請求進行處理)
在當前請求是一個內(nèi)部子請求時,此標記強制重寫引擎跳過該重寫規(guī)則。比如螺戳,在mod_include試圖搜索目錄默認文件(index.xxx)時规揪,Apache會在內(nèi)部產(chǎn)生子請求。對于子請求温峭,重寫規(guī)則不一定有用,而且如果整個規(guī)則集都起作用字支,它甚至可能會引發(fā)錯誤凤藏。所以,可以用這個標記來排除某些規(guī)則
使用原則:如果你為URL添加了CGI腳本前綴堕伪,以強制它們由CGI腳本處理揖庄,但對子請求處理的出錯率(或者資源開銷)很高,在這種情況下欠雌,可以使用這個標記
"proxy|P"(強制為代理)
此標記使替換成分被內(nèi)部地強制作為代理請求發(fā)送蹄梢,并立即中斷重寫處理,然后把處理移交給mod_proxy模塊富俄。你必須確保此替換串是一個能夠被mod_proxy處理的有效URI(比如以http://hostname開頭)禁炒,否則將得到一個代理模塊返回的錯誤。使用這個標記霍比,可以把某些遠程成分映射到本地服務(wù)器域名空間幕袱,從而增強了ProxyPass指令的功能。
注意:要使用這個功能悠瞬,必須已經(jīng)啟用了mod_proxy模塊
"passthrough|PT"(移交給下一個處理器)
此標記強制重寫引擎將內(nèi)部request_rec結(jié)構(gòu)中的uri字段設(shè)置為filename字段的值们豌,這個小小的修改使得RewriteRule指令的輸出能夠被(從URI轉(zhuǎn)換到文件名的)Alias, ScriptAlias, Redirect等指令進行后續(xù)處理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。舉一個能說明其含義的例子: 如果要將/abc重寫為/def浅妆, 然后再使用mod_alias將/def轉(zhuǎn)換為/ghi望迎,可以這樣:
RewriteRule ^/abc(.) /def$1 [PT]
Alias /def /ghi
如果省略了PT標記,雖然將uri=/abc/…重寫為filename=/def/…的部分運作正常凌外,但是后續(xù)的mod_alias在試圖將URI轉(zhuǎn)換到文件名時會遭遇失效辩尊。
注意:如果需要混合使用多個將URI轉(zhuǎn)換到文件名的模塊時,就必須使用這個標記趴乡。对省。此處混合使用mod_alias和mod_rewrite就是個典型的例子
"qsappend|QSA"(追加查詢字符串)
此標記強制重寫引擎在已有的替換字符串中追加一個查詢字符串,而不是簡單的替換晾捏。如果需要通過重寫規(guī)則在請求串中增加信息蒿涎,就可以使用這個標記
"redirect|R [=code]"(強制重定向)
若Substitution以http://thishost[:thisport]/(使新的URL成為一個URI)開頭,可以強制性執(zhí)行一個外部重定向惦辛。如果沒有指定code劳秋,則產(chǎn)生一個HTTP響應(yīng)碼302(臨時性移動)。如果需要使用在300-400范圍內(nèi)的其他響應(yīng)代碼,只需在此指定即可(或使用下列符號名稱之一:temp(默認), permanent, seeother)玻淑。使用它可以把規(guī)范化的URL反饋給客戶端嗽冒,如將”/~”重寫為”/u/”,或始終對/u/user加上斜杠补履,等等添坊。
注意:在使用這個標記時,必須確保該替換字段是一個有效的URL箫锤。否則贬蛙,它會指向一個無效的位置!并且要記住谚攒,此標記本身只是對URL加上http://thishost[:thisport]/前綴阳准,重寫操作仍然會繼續(xù)進行。通常馏臭,你還會希望停止重寫操作而立即重定向野蝇,那么就還需要使用"L'標記
"skip|S=num"(跳過后繼規(guī)則)
此標記強制重寫引擎跳過當前匹配規(guī)則之后的num個規(guī)則。它可以模擬if-then-else結(jié)構(gòu):最后一個規(guī)則是then從句括儒,而被跳過的skip=N個規(guī)則是else從句绕沈。注意:它和"chain|C"標記是不同的
"type|T=MIME-type"(強制MIME類型)
強制目標文件的MIME類型為MIME-type,可以用來基于某些特定條件強制設(shè)置內(nèi)容類型塑崖。比如七冲,下面的指令可以讓.php文件在以.phps擴展名調(diào)用的情況下由mod_php按照PHP源代碼的MIME類型(application/x-httpd-php-source)顯示:
RewriteRule ^(.+.php)s$ $1 [T=application/x-httpd-php-source]
.htaccess應(yīng)用實例:
http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html
http://www.chinaz.com/web/2010/0415/111514.shtml
iis-url重寫:http://www.cnblogs.com/hejunrex/archive/2011/10/12/2208663.html
Nginx:https://xuexb.com/post/nginx-url-rewrite.html