1蕴忆、簡(jiǎn)介
Apached的重寫功能悲幅,即是mod_rewrite模塊功能套鹅,它是apache的一個(gè)模塊。它的功能非常強(qiáng)大汰具,可以操作URL中的所有部分卓鹿。
因此我們就可以改寫url,給用戶提供一個(gè)簡(jiǎn)介大方的url留荔,當(dāng)用戶訪問時(shí)可以通過(guò)mod_rewrite模塊功能轉(zhuǎn)換為真正的資源路徑吟孙。通過(guò)mod_rewrite能實(shí)現(xiàn)的功能還有很多,例如隱藏真實(shí)地址聚蝶、實(shí)現(xiàn)URL跳轉(zhuǎn)杰妓、域名跳轉(zhuǎn)、防盜鏈碘勉、限制訪問資源類型等等巷挥。
2、工作流程
mod_rewrite模塊在運(yùn)行時(shí)會(huì)使用兩個(gè)Hook程序验靡。
第一個(gè)是從URL到文件名轉(zhuǎn)換的Hook倍宾。當(dāng)有訪問到達(dá)Apache服務(wù)器的時(shí)雏节,服務(wù)器會(huì)確認(rèn)相應(yīng)主機(jī)(或虛擬主機(jī)),這時(shí)mod_rewrite模塊就開始工作凿宾,它將會(huì)先處理服務(wù)器全局中mod_rewrite模塊所提供的指令矾屯,然后根據(jù)用戶提供的指令進(jìn)行改寫。
第二個(gè)是修正URL的Hook初厚。在此階段mod_rewrite模塊會(huì)處理非全局的設(shè)置。例如孙技,目錄中的.htaccess文件中的設(shè)置产禾。但是此時(shí)已經(jīng)完成URL的翻譯(由URL轉(zhuǎn)換為文件名),因此是無(wú)法在次對(duì)目錄級(jí)別的URL進(jìn)行改寫操作牵啦,但是moe_rewrite模塊會(huì)將已翻譯的URL再次轉(zhuǎn)換為URL的狀態(tài)亚情,繼續(xù)進(jìn)行目錄級(jí)別的URL改寫。(mod_rewrite模塊將會(huì)使用讀后請(qǐng)求階段的回叫函數(shù)重新開始一個(gè)請(qǐng)求的循環(huán)處理)
Rewirte模塊規(guī)則集的處理
當(dāng)mod_rewrite在這兩個(gè)API階段中開始執(zhí)行時(shí)哈雏,它會(huì)讀取配置結(jié)構(gòu)中配置好的 (或者是在服務(wù)啟動(dòng)時(shí)建立的服務(wù)器級(jí)的楞件,或者是在遍歷目錄采集到的目錄級(jí)的)規(guī)則集,然后裳瘪,啟動(dòng)URL重寫引擎來(lái)處理(帶有一個(gè)或多個(gè)條件的)規(guī)則集土浸。無(wú)論是服務(wù)器級(jí)的還是目錄級(jí)的規(guī)則集,都是由同一個(gè)URL重寫引擎處理彭羹,只是最終結(jié)果處理不同而已黄伊。
規(guī)則集中規(guī)則的順序是很重要的,因?yàn)橹貙懸媸前匆环N特殊的順序處理的:逐個(gè)遍歷每個(gè)規(guī)則(RewriteRule指令)派殷,如果出現(xiàn)一個(gè)匹配條件的規(guī)則还最,則可能回頭遍歷已有的規(guī)則條件(RewriteCond指令)。由于歷史的原因毡惜,條件規(guī)則是前置的拓轻,所以控制流程略顯冗長(zhǎng),細(xì)節(jié)見圖-1经伙。
可見扶叉,URL首先與每個(gè)規(guī)則的Pattern匹配,如果匹配失敗橱乱,mod_rewrite將立即終止此規(guī)則的處理辜梳,繼而處理下一個(gè)規(guī)則。如果匹配成功泳叠,mod_rewrite將尋找相應(yīng)的規(guī)則條件作瞄,如果一個(gè)條件都沒有,則簡(jiǎn)單地用Substitution構(gòu)造的新值來(lái)替換URL危纫,然后繼續(xù)處理其他規(guī)則宗挥;但是如果條件存在乌庶,則開始一個(gè)內(nèi)部循環(huán)按其列出的順序逐個(gè)處理。對(duì)規(guī)則條件的處理有所不同:URL并不與模式進(jìn)行匹配契耿,而是首先通過(guò)擴(kuò)展變量瞒大、反向引用、查找映射表等步驟建立一個(gè)TestString字符串搪桂,然后用它來(lái)與CondPattern匹配透敌。如果匹配失敗,則整個(gè)條件集和對(duì)應(yīng)的規(guī)則失斕咝怠酗电;如果匹配成功,則執(zhí)行下一個(gè)規(guī)則直到所有條件執(zhí)行完畢内列。如果所有條件得以匹配撵术,則以Substitution替換URL,并且繼續(xù)處理话瞧。(本部分引用譯者:金步國(guó))
網(wǎng)絡(luò)圖片:
3嫩与、URL重寫指令
最簡(jiǎn)單的重寫指令可以簡(jiǎn)單到讓你無(wú)法想象!
只需要兩步就可以完成了交排。第一使用RewriteEngine開啟mod_rewrite模塊功能划滋;第二通過(guò)RewriteRule定義URL重寫規(guī)則
1)、URL重寫指令套路
---------------------------------------------------------------
RewriteEngine on #開啟mod_rewrite模塊功能
RewriteBase 路徑 #基準(zhǔn)URL(使用alias設(shè)置別名則需使用這個(gè))
RewriteCond TestString CondPattern [flags] #重寫條件(可以多個(gè))
RewriteRule Pattern Substitution [flags] #重寫規(guī)則
----------------------------------------------------------------
#4个粱、5行可以可以多個(gè)
#按順序一個(gè)一個(gè)執(zhí)行RewriteRule([flags不終止情況下])
##以上是常用的指令古毛,還有一些很少見的指令,需要的自己去查資料了解
2)都许、RewriteRule Pattern Substitution [flags]
1稻薇、pattern是作用于當(dāng)前URL的perl兼容的正則表達(dá)式。當(dāng)前URL是指該規(guī)則生效時(shí)刻的URL的值胶征。它可能與被請(qǐng)求時(shí)的URL截然不同塞椎,因?yàn)橹翱赡鼙黄渌鸕ewriteRule或者alias指令修改過(guò)。
2睛低、Substitution是當(dāng)URL與Pattern匹配成功后案狠。用來(lái)代替的字符串。
- 可以對(duì)pattern反向引用$N(N=0~9)钱雷,表示正則表達(dá)式中第N個(gè)括號(hào)中的內(nèi)容
- 對(duì)最后匹配的RewriteCond反向引用%N(N=0~9)骂铁,表示最后匹配的RewriteCond第N對(duì)括號(hào)中的內(nèi)容
- 服務(wù)器變量%{VARNAME}
- 映射函數(shù)調(diào)用${mapname:key|default} (通過(guò)RewriteMap指令定義映射輔助完成)
3、[flags]罩抗,標(biāo)志符拉庵,多個(gè)則用逗號(hào)隔開。
標(biāo)志符(摘抄于網(wǎng)上):
redirect|R [=code] (強(qiáng)制重定向 redirect)
以 http://thishost[:thisport]/(使新的URL成為一個(gè)URI) 為前綴的Substitution可以強(qiáng)制性執(zhí)行一個(gè)外部重定向套蒂。 如果code沒有指定钞支,則產(chǎn)生一個(gè)HTTP響應(yīng)代碼302(臨時(shí)性移動(dòng))茫蛹。如果需要使用在300-400范圍內(nèi)的其他響應(yīng)代碼,只需在此指定這個(gè)數(shù)值即可烁挟, 另外婴洼,還可以使用下列符號(hào)名稱之一: temp (默認(rèn)的), permanent, seeother. 用它可以把規(guī)范化的URL反饋給客戶端,如, 重寫“/~”為 “/u/”撼嗓,或?qū)?u/user加上斜杠柬采,等等。
注意: 在使用這個(gè)標(biāo)記時(shí)且警,必須確保該替換字段是一個(gè)有效的URL! 否則警没,它會(huì)指向一個(gè)無(wú)效的位置! 并且要記住,此標(biāo)記本身只是對(duì)URL加上 http://thishost[:thisport]/的前綴振湾,重寫操作仍然會(huì)繼續(xù)。通常亡脸,你會(huì)希望停止重寫操作而立即重定向押搪,則還需要使用’L’標(biāo)記.
forbidden|F (強(qiáng)制URL為被禁止的 forbidden)
強(qiáng)制當(dāng)前URL為被禁止的,即浅碾,立即反饋一個(gè)HTTP響應(yīng)代碼403(被禁止的)大州。使用這個(gè)標(biāo)記,可以鏈接若干RewriteConds以有條件地阻塞某些URL垂谢。
gone|G(強(qiáng)制URL為已廢棄的 gone)
強(qiáng)制當(dāng)前URL為已廢棄的厦画,即,立即反饋一個(gè)HTTP響應(yīng)代碼410(已廢棄的)滥朱。使用這個(gè)標(biāo)記根暑,可以標(biāo)明頁(yè)面已經(jīng)被廢棄而不存在了.
proxy|P (強(qiáng)制為代理 proxy)
此標(biāo)記使替換成分被內(nèi)部地強(qiáng)制為代理請(qǐng)求,并立即(即徙邻, 重寫規(guī)則處理立即中斷)把處理移交給代理模塊排嫌。你必須確保此替換串是一個(gè)有效的(比如常見的以 http://hostname開頭的)能夠?yàn)锳pache代理模塊所處理的URI。使用這個(gè)標(biāo)記缰犁,可以把某些遠(yuǎn)程成分映射到本地服務(wù)器名稱空間淳地, 從而增強(qiáng)了ProxyPass指令的功能。
注意: 要使用這個(gè)功能帅容,代理模塊必須編譯在Apache服務(wù)器中颇象。 如果你不能確定,可以檢查“httpd -l”的輸出中是否有mod_proxy.c并徘。 如果有遣钳,則mod_rewrite可以使用這個(gè)功能;如果沒有饮亏,則必須啟用mod_proxy并重新編譯“httpd”程序耍贾。
last|L (最后一個(gè)規(guī)則 last)
立即停止重寫操作阅爽,并不再應(yīng)用其他重寫規(guī)則。 它對(duì)應(yīng)于Perl中的last命令或C語(yǔ)言中的break命令荐开。這個(gè)標(biāo)記可以阻止當(dāng)前已被重寫的URL為其后繼的規(guī)則所重寫付翁。 舉例,使用它可以重寫根路徑的URL(’/’)為實(shí)際存在的URL, 比如, ‘/e/www/’.
next|N (重新執(zhí)行 next round)
重新執(zhí)行重寫操作(從第一個(gè)規(guī)則重新開始). 這時(shí)再次進(jìn)行處理的URL已經(jīng)不是原始的URL了晃听,而是經(jīng)最后一個(gè)重寫規(guī)則處理的URL百侧。它對(duì)應(yīng)于Perl中的next命令或C語(yǔ)言中的continue命令。 此標(biāo)記可以重新開始重寫操作能扒,即, 立即回到循環(huán)的頭部佣渴。
但是要小心,不要制造死循環(huán)!
chain|C (與下一個(gè)規(guī)則相鏈接 chained)
此標(biāo)記使當(dāng)前規(guī)則與下一個(gè)(其本身又可以與其后繼規(guī)則相鏈接的初斑, 并可以如此反復(fù)的)規(guī)則相鏈接辛润。 它產(chǎn)生這樣一個(gè)效果: 如果一個(gè)規(guī)則被匹配,通常會(huì)繼續(xù)處理其后繼規(guī)則见秤, 即砂竖,這個(gè)標(biāo)記不起作用;如果規(guī)則不能被匹配鹃答,則其后繼的鏈接的規(guī)則會(huì)被忽略乎澄。比如,在執(zhí)行一個(gè)外部重定向時(shí)测摔, 對(duì)一個(gè)目錄級(jí)規(guī)則集置济,你可能需要?jiǎng)h除“.www” (此處不應(yīng)該出現(xiàn)“.www”的)。
type|T=MIME-type(強(qiáng)制MIME類型 type)
強(qiáng)制目標(biāo)文件的MIME類型為MIME-type锋八。 比如浙于,它可以用于模擬mod_alias中的ScriptAlias指令,以內(nèi)部地強(qiáng)制被映射目錄中的所有文件的MIME類型為“application/x-httpd-cgi”查库。
nosubreq|NS (僅用于不對(duì)內(nèi)部子請(qǐng)求進(jìn)行處理 no internal sub-request)
在當(dāng)前請(qǐng)求是一個(gè)內(nèi)部子請(qǐng)求時(shí)路媚,此標(biāo)記強(qiáng)制重寫引擎跳過(guò)該重寫規(guī)則。比如樊销,在mod_include試圖搜索可能的目錄默認(rèn)文件(index.xxx)時(shí)整慎, Apache會(huì)內(nèi)部地產(chǎn)生子請(qǐng)求。對(duì)子請(qǐng)求围苫,它不一定有用的裤园,而且如果整個(gè)規(guī)則集都起作用,它甚至可能會(huì)引發(fā)錯(cuò)誤剂府。所以拧揽,可以用這個(gè)標(biāo)記來(lái)排除某些規(guī)則。
根據(jù)你的需要遵循以下原則: 如果你使用了有CGI腳本的URL前綴,以強(qiáng)制它們由CGI腳本處理淤袜,而對(duì)子請(qǐng)求處理的出錯(cuò)率(或者開銷)很高痒谴,在這種情況下,可以使用這個(gè)標(biāo)記铡羡。
nocase|NC (忽略大小寫 no case)
它使Pattern忽略大小寫积蔚,即, 在Pattern與當(dāng)前URL匹配時(shí),’A-Z’ 和’a-z’沒有區(qū)別烦周。
qsappend|QSA (追加請(qǐng)求串 query string append)
此標(biāo)記強(qiáng)制重寫引擎在已有的替換串中追加一個(gè)請(qǐng)求串尽爆,而不是簡(jiǎn)單的替換。如果需要通過(guò)重寫規(guī)則在請(qǐng)求串中增加信息读慎,就可以使用這個(gè)標(biāo)記漱贱。
noescape|NE (在輸出中不對(duì)URI作轉(zhuǎn)義 no URI escaping)
此標(biāo)記阻止mod_rewrite對(duì)重寫結(jié)果應(yīng)用常規(guī)的URI轉(zhuǎn)義規(guī)則。 一般情況下夭委,特殊字符(如’%’, ‘$’, ‘;’等)會(huì)被轉(zhuǎn)義為等值的十六進(jìn)制編碼幅狮。 此標(biāo)記可以阻止這樣的轉(zhuǎn)義,以允許百分號(hào)等符號(hào)出現(xiàn)在輸出中株灸,如:
RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 可以使’/foo/zed’轉(zhuǎn)向到一個(gè)安全的請(qǐng)求’/bar?arg=P1=zed’.
passthrough|PT (移交給下一個(gè)處理器 pass through)
此標(biāo)記強(qiáng)制重寫引擎將內(nèi)部結(jié)構(gòu)request_rec中的uri字段設(shè)置為 filename字段的值彪笼,它只是一個(gè)小修改,使之能對(duì)來(lái)自其他URI到文件名翻譯器的 Alias蚂且,ScriptAlias, Redirect 等指令的輸出進(jìn)行后續(xù)處理。舉一個(gè)能說(shuō)明其含義的例子:如果要通過(guò)mod_rewrite的重寫引擎重寫/abc為/def幅恋,然后通過(guò)mod_alias使/def轉(zhuǎn)變?yōu)?ghi杏死,可以這樣:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果省略了PT標(biāo)記,雖然mod_rewrite運(yùn)作正常捆交, 即, 作為一個(gè)使用API的URI到文件名翻譯器淑翼,它可以重寫uri=/abc/…為filename=/def/…,但是品追,后續(xù)的mod_alias在試圖作URI到文件名的翻譯時(shí)玄括,則會(huì)失效。
注意: 如果需要混合使用不同的包含URI到文件名翻譯器的模塊時(shí)肉瓦, 就必須使用這個(gè)標(biāo)記遭京。∨⒗颍混合使用mod_alias和mod_rewrite就是個(gè)典型的例子哪雕。
For Apache hackers
如果當(dāng)前Apache API除了URI到文件名hook之外,還有一個(gè)文件名到文件名的hook鲫趁, 就不需要這個(gè)標(biāo)記了! 但是斯嚎,如果沒有這樣一個(gè)hook,則此標(biāo)記是唯一的解決方案。 Apache Group討論過(guò)這個(gè)問題堡僻,并在Apache 2.0 版本中會(huì)增加這樣一個(gè)hook糠惫。
skip|S=num (跳過(guò)后繼的規(guī)則 skip)
此標(biāo)記強(qiáng)制重寫引擎跳過(guò)當(dāng)前匹配規(guī)則后繼的num個(gè)規(guī)則。 它可以實(shí)現(xiàn)一個(gè)偽if-then-else的構(gòu)造: 最后一個(gè)規(guī)則是then從句钉疫,而被跳過(guò)的skip=N個(gè)規(guī)則是else從句. (它和’chain|C’標(biāo)記是不同的!)
env|E=VAR:VAL (設(shè)置環(huán)境變量 environment variable)
此標(biāo)記使環(huán)境變量VAR的值為VAL, VAL可以包含可擴(kuò)展的反向引用的正則表達(dá)式N和%N硼讽。 此標(biāo)記可以多次使用以設(shè)置多個(gè)變量。這些變量可以在其后許多情況下被間接引用陌选,但通常是在XSSI (via ) or CGI (如ENV{’VAR’})中理郑, 也可以在后繼的RewriteCond指令的pattern中通過(guò)%{ENV:VAR}作引用。使用它可以從URL中剝離并記住一些信息咨油。
cookie|CO=NAME:VAL:domain[:lifetime[:path]] (設(shè)置cookie)
它在客戶端瀏覽器上設(shè)置一個(gè)cookie您炉。 cookie的名稱是NAME,其值是VAL役电。 domain字段是該cookie的域赚爵,比如’.apache.org’, 可選的lifetime是cookie生命期的分鐘數(shù),可選的path是cookie的路徑法瑟。
3)冀膝、RewriteCond TestString CondPattern [flags]
Rewritecond指令定義一條規(guī)則條件。在一條rewriterule指令前面可能會(huì)有一條或者多條rewritecond指令霎挟,只有當(dāng)自身模板匹配成功且這些條件也滿足時(shí)(即RewriteRule中的pattern匹配成功)窝剖,規(guī)則條件才被應(yīng)用于當(dāng)前URL處理。
1酥夭、TestString是一個(gè)純文本的字符串
- 可以對(duì)pattern反向引用$N(N=0~9)赐纱,緊跟在RewriteCond后面的RewriteRule正則表達(dá)式中第N個(gè)括號(hào)中的內(nèi)容
- 反向引用%N(N=0~9),表示RewriteCond中CondPattern中第N對(duì)括號(hào)中的內(nèi)容
- 服務(wù)器變量%{VARNAME}
2熬北、CondPattern是條件pattern疙描,一個(gè)應(yīng)用于當(dāng)前實(shí)例TestString的正則表達(dá)式。即TestString與條件pattern條件進(jìn)行匹配讶隐。如果匹配則RewriteCond的值為Rrue起胰,反之為False
可以使用以下特殊變量(可使用'!'實(shí)現(xiàn)反轉(zhuǎn)):
'>CondPattern’ (大于) 將condPattern當(dāng)作一個(gè)普通字符串,將它和TestString進(jìn)行比較巫延,當(dāng)TestString 的字符大于CondPattern為真效五。
‘=CondPattern’ (等于) 將condPattern當(dāng)作一個(gè)普通字符串,將它和TestString進(jìn)行比較炉峰,當(dāng)TestString 與CondPattern完全相同時(shí)為真.如果CondPattern只是 “” (兩個(gè)引號(hào)緊挨在一起) 此時(shí)需TestString 為空字符串方為真火俄。
‘-d’ (是否為目錄) 將testString當(dāng)作一個(gè)目錄名,檢查它是否存在以及是否是一個(gè)目錄讲冠。
‘-f’ (是否是regular file) 將testString當(dāng)作一個(gè)文件名瓜客,檢查它是否存在以及是否是一個(gè)regular文件。
‘-s’ (是否為長(zhǎng)度不為0的regular文件) 將testString當(dāng)作一個(gè)文件名,檢查它是否存在以及是否是一個(gè)長(zhǎng)度大于0的regular文件谱仪。
‘-l’ (是否為symbolic link) 將testString當(dāng)作一個(gè)文件名户侥,檢查它是否存在以及是否是一個(gè) symbolic link杜恰。
‘-F’ (通過(guò)subrequest來(lái)檢查某文件是否可訪問) 檢查TestString是否是一個(gè)合法的文件,而且通過(guò)服務(wù)器范圍內(nèi)的當(dāng)前設(shè)置的訪問控制進(jìn)行訪問。這個(gè)檢查是通過(guò)一個(gè)內(nèi)部subrequest完成的, 因此需要小心使用這個(gè)功能以降低服務(wù)器的性能笋妥。
‘-U’ (通過(guò)subrequest來(lái)檢查某個(gè)URL是否存在) 檢查TestString是否是一個(gè)合法的URL浸赫,而且通過(guò)服務(wù)器范圍內(nèi)的當(dāng)前設(shè)置的訪問控制進(jìn)行訪問肢执。這個(gè)檢查是通過(guò)一個(gè)內(nèi)部subrequest完成的, 因此需要小心使用這個(gè)功能以降低服務(wù)器的性能留搔。
3、[flags]是第三個(gè)參數(shù)砂吞,多個(gè)標(biāo)志之間用逗號(hào)隔開
’nocase|NC’ (不區(qū)分大小寫) 在擴(kuò)展后的TestString和CondPattern中署恍,比較時(shí)不區(qū)分文本的大小寫。注意蜻直,這個(gè)標(biāo)志對(duì)文件系統(tǒng)和subrequest檢查沒有影響.
’ornext|OR’ (建立與下一個(gè)條件的或的關(guān)系) 默認(rèn)的情況下盯质,二個(gè)條件之間是AND的關(guān)系,用這個(gè)標(biāo)志將關(guān)系改為OR概而。
4)呼巷、Rewrite****時(shí)服務(wù)器變量(僅列出少數(shù))
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
connection & request:REMOTE_ADDR, QUERY_STRING
server internals::DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
system stuff: TIME_YEAR, TIME_MON, TIME_DAY
5)、簡(jiǎn)單正則表達(dá)式規(guī)則
. 匹配任何單字符
[chars] 匹配字符串:chars
[^chars] 不匹配字符串:chars
text1|text2 可選擇的字符串:text1或text2
? 匹配0到1個(gè)字符
- 匹配0到多個(gè)字符
- 匹配1到多個(gè)字符
^ 字符串開始標(biāo)志
$ 字符串結(jié)束標(biāo)志
\n 轉(zhuǎn)義符標(biāo)志
【注意】:一代Apache要求URL有斜杠而二代Apache卻不允許赎瑰,因此使用 ^/?
4王悍、例子解析
例1(簡(jiǎn)單例子):
(在.htaccess里進(jìn)行規(guī)制重寫)
RewriteEngine ON
RewriteRule ^user/(w+)/?$user.php?id=$1
^:輸入的開頭 以u(píng)ser/開頭請(qǐng)求的地址
(w+):提取所有的字母,傳給$1
/?:可選斜杠
$:結(jié)束符
替換為:user.php?id=*
注意:有些apache(具體哪個(gè)版本忘啦)不兼容簡(jiǎn)寫模式 w+ => [a-zA-Z_-]
例2(禁止IE和Opera瀏覽器訪問):
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] #'-'表示不替換URL
例3(不合法路徑返回首頁(yè)):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
例4(防盜鏈):
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC] #判斷請(qǐng)求的是否是自己的域名
RewriteCond %{HTTP_REFERER} !^$ #{HTTP_REFERER}不為空
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] #返回警告圖片
例5(改變?cè)L問URL目錄名):
即隱藏真實(shí)的目錄名字
RewriteEngine On
RewriteRule ^/?old_dir/([a-z\.]+)$ new_dir/$1 [R=301,L]
#new_dir為真正目錄
例6(創(chuàng)建無(wú)文件后綴鏈接):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f #判斷該后綴文件是否存在
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f #判斷該后綴文件是否存在
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L]
例7(限制只能顯示圖片):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
例8(文件不存在重定向404):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !f
RewriteCond %{REQUEST_FILENAME} !d
RewriteRule .? /404.php [L]