apache重寫規(guī)則

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经伙。

image

可見扶叉,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ò)圖片:

image

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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末餐曼,一起剝皮案震驚了整個(gè)濱河市配名,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晋辆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宇整,死亡現(xiàn)場(chǎng)離奇詭異瓶佳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鳞青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門霸饲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人臂拓,你說(shuō)我怎么就攤上這事厚脉。” “怎么了胶惰?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵傻工,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)中捆,這世上最難降的妖魔是什么鸯匹? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泄伪,結(jié)果婚禮上殴蓬,老公的妹妹穿的比我還像新娘。我一直安慰自己蟋滴,他們只是感情好染厅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著津函,像睡著了一般肖粮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球散,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天尿赚,我揣著相機(jī)與錄音,去河邊找鬼蕉堰。 笑死凌净,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屋讶。 我是一名探鬼主播冰寻,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皿渗!你這毒婦竟也來(lái)了斩芭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乐疆,失蹤者是張志新(化名)和其女友劉穎划乖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挤土,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琴庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仰美。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迷殿。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咖杂,靈堂內(nèi)的尸體忽然破棺而出庆寺,到底是詐尸還是另有隱情,我是刑警寧澤诉字,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布懦尝,位于F島的核電站知纷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏导披。R本人自食惡果不足惜屈扎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撩匕。 院中可真熱鬧鹰晨,春花似錦、人聲如沸止毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁凛。三九已至忍疾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谨朝,已是汗流浹背卤妒。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留字币,地道東北人则披。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洗出,于是被迫代替她去往敵國(guó)和親士复。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 看了一些關(guān)于.htaccess翩活,apache重寫url的規(guī)則阱洪,一般都寫得很清楚。但是對(duì)于我一個(gè)小白菠镇,感覺要挖的東西...
    yancolin閱讀 5,566評(píng)論 0 3
  • 前兩天部署一個(gè)項(xiàng)目到本機(jī)環(huán)境冗荸,從nginx轉(zhuǎn)到apache,因?yàn)椴皇煜pache的重寫規(guī)則利耍,給自己挖了很多坑蚌本。。...
    牽小馬過(guò)河閱讀 1,044評(píng)論 0 0
  • 重寫規(guī)則 【重寫規(guī)則的作用范圍】 可以使用在Apache主配置文件httpd.conf中 可以使用在httpd.c...
    桖辶殤閱讀 1,666評(píng)論 0 0
  • 作者:燁竹 簡(jiǎn)單理解 URL重寫就是首先獲得一個(gè)進(jìn)入的URL請(qǐng)求然后把它重新寫成網(wǎng)站可以處理的另一個(gè)URL的過(guò)程 ...
    DragonRat閱讀 4,455評(píng)論 0 0
  • 孩童時(shí)堂竟,對(duì)于過(guò)生日,總是翹首以待玻佩,提前半年就開始扳起手指算日子出嘹。因?yàn)槊看芜^(guò)生日都有蛋糕吃,甜膩的味道最是能收買孩子...
    我的天空是一片海閱讀 469評(píng)論 2 4