在站點(diǎn)根目錄建立.htaccess文件,寫入如下內(nèi)容:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !www.dgkai.cn [NC]
RewriteCond %{HTTP_HOST} !zui88.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^.* – [F,L]
這樣實(shí)現(xiàn)的結(jié)果是只能通過(guò)www.dgkai.cn,zui88.com來(lái)訪問(wèn)站點(diǎn),用其他的HOST訪問(wèn)都會(huì)顯示403Forbidden。
其中:{HTTP_HOST}代表HTTP協(xié)議GET動(dòng)作同時(shí)傳遞的Host的值,[NC]代表忽略大小寫;[F]代表動(dòng)作為禁止;[L]代表最終匹配。
]]>發(fā)現(xiàn)子目錄與根目錄不同的地方是訪問(wèn)地址后面有沒(méi)有加斜杠所請(qǐng)求的地址有一點(diǎn)點(diǎn)不同,下面是規(guī)則:
RewriteBase /news
RewriteCond %{HTTP_HOST} ^zui88.com [NC]
RewriteRule com(.*)$ http://www.dgkai.cn$1 [L,R=301]
#不加斜杠請(qǐng)求的地址是/wwwroot/zui88.com/news/
RewriteCond %{HTTP_HOST} ^zui88.com [NC]
RewriteRule (.*)$ http://www.dgkai.cn/news/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^124.173.133.154 [NC]
RewriteRule com(.*)$ http://www.dgkai.cn$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^124.173.133.154 [NC]
RewriteRule (.*)$ http://www.dgkai.cn/news/$1 [L,R=301]
RewriteRule ^(.*)$ index.php/$1 [L]
#RewriteRule ^.*/(sysadm/.+)$ $1/index.php [L]
]]>所以如果子目錄也要用到根目錄的配置規(guī)則,最好是重新定義,因?yàn)槿绻麊渭兊睦^承的話,根目錄htaccess里面的某些規(guī)則的路徑可能已經(jīng)不適用子目錄。
]]>RewriteEngine 可用On 或者 Off 打開或關(guān)閉rewrite功能。
rewrite configurations 不會(huì)繼承,所以你得給每個(gè)你想用 rewrite功能的virtual host加上這個(gè)指令。
RewriteBase URL-path
RewriteBase指令顯式地設(shè)置了目錄級(jí)重寫的基準(zhǔn)URL。在下文中,你可以看見(jiàn)RewriteRule可以用于目錄級(jí)的配置文件中 (.htaccess)并在局部范圍內(nèi)起作用,即規(guī)則實(shí)際處理的只是剝離了本地路徑前綴的一部分。處理結(jié)束后,這個(gè)路徑會(huì)被自動(dòng)地附著回去。默認(rèn)值是"RewriteBase physical-directory-path"。
在對(duì)一個(gè)新的URL進(jìn)行替換時(shí),此模塊必須把這個(gè)URL重新注入到服務(wù)器處理中。為此,它必須知道其對(duì)應(yīng)的URL前綴或者說(shuō)URL基準(zhǔn)。通常,此前綴就是對(duì)應(yīng)的文件路徑。但是,大多數(shù)網(wǎng)站URL不是直接對(duì)應(yīng)于其物理文件路徑的,因而一般不能做這樣的假定! 所以在這種情況下,就必須用RewriteBase指令來(lái)指定正確的URL前綴。
如果你的網(wǎng)站服務(wù)器URL不是與物理文件路徑直接對(duì)應(yīng)的,而又需要使用RewriteBase指令,則必須在每個(gè)對(duì)應(yīng)的.htaccess文件中指定RewriteRule 。
RewriteCond TestString CondPattern
RewriteCond指令定義了一個(gè)規(guī)則的條件,即在一個(gè)RewriteRule指令之前有一個(gè)或多個(gè)RewriteCond指令。條件之后的重寫規(guī)則僅在當(dāng)前URI與pattern匹配并且符合這些條件的時(shí)候才會(huì)起作用。
Notice:All of these tests can also be prefixed by an exclamation mark ('!') to negate their meaning. 在正則表達(dá)式中,如果取反的話要用^,在這里需要用!號(hào)取反
RewriteOptions Options
Sets some special options for the rewrite engine.
設(shè)定一些特殊的選項(xiàng)給rewrite.
The Option string can be currently only one:inherit
inherit
此值強(qiáng)制當(dāng)前配置可以繼承其父配置。 在虛擬主機(jī)級(jí)配置中,它意味著主服務(wù)器的映射表、條件和規(guī)則可以被繼承。 在目錄級(jí)配置中,它意味著其父目錄的.htaccess中的條件和規(guī)則可以被繼承。
MaxRedirects=number
為了避免目錄級(jí)RewriteRule的無(wú)休止的內(nèi)部重定向, 在此類重定向和500內(nèi)部服務(wù)器錯(cuò)誤次數(shù)達(dá)到一個(gè)最大值的時(shí)候, mod_rewrite會(huì)停止對(duì)此請(qǐng)求的處理。 如果你確實(shí)需要對(duì)每個(gè)請(qǐng)求允許大于10次的內(nèi)部重定向,可以增大這個(gè)值。
This forces the current configuration to inherit the configuration of the parent.
強(qiáng)制當(dāng)前的配置繼承它parent的配置。
在per-virtual-server環(huán)境下,意味著maps, conditions , rules會(huì)被繼承!
在per-directory 環(huán)境下 意味著它父目錄的.htaccess配置中的conditions , rules 會(huì)被繼承!
RewriteRule Pattern Substitution [flags]
Text:
. 任何單字符
[chars] Character class: One of chars
[^chars] Character class: None of chars
text1|text2 兩者選一個(gè): text1 or text2
Quantifiers:量詞
? 0 or 1 of the 前面的 text
* 0 or N of the 前面的 text (N > 0)
+ 1 or N of the 前面的 text (N > 1)
Grouping:
(text) Grouping of text
可用$N來(lái)得到()中的內(nèi)容:
( (a|b) | (c|d))
$1 $2 $3
Anchors:
^ Start of line anchor
$ End of line anchor
Escaping:
\char escape that particular char
(for instance to specify the chars ".[]()" etc.)
注意:沒(méi)有并且&
=========================================================================================
flags
1.
'redirect|R [=code]' (強(qiáng)制重定向 redirect)
以http://thishost[:thisport]/(使新的URL成為一個(gè)URI) 為前綴的Substitution可以強(qiáng)制性執(zhí)行一個(gè)外部重定向。 如果code沒(méi)有指定,則產(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)記.
2.
'forbidden|F' (強(qiáng)制URL為被禁止的 forbidden)
強(qiáng)制當(dāng)前URL為被禁止的,即,立即反饋一個(gè)HTTP響應(yīng)代碼403(被禁止的)。 使用這個(gè)標(biāo)記,可以鏈接若干RewriteConds以有條件地阻塞某些URL。
3.
'gone|G' (強(qiáng)制URL為已廢棄的 gone)
強(qiáng)制當(dāng)前URL為已廢棄的,即,立即反饋一個(gè)HTTP響應(yīng)代碼410(已廢棄的)。 使用這個(gè)標(biāo)記,可以標(biāo)明頁(yè)面已經(jīng)被廢棄而不存在了.
4.
'proxy|P' (強(qiáng)制為代理 proxy)
此標(biāo)記使替換成分被內(nèi)部地強(qiáng)制為代理請(qǐng)求,并立即(即, 重寫規(guī)則處理立即中斷)把處理移交給代理模塊。 你必須確保此替換串是一個(gè)有效的(比如常見(jiàn)的以 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è)功能; 如果沒(méi)有,則必須啟用mod_proxy并重新編譯``httpd''程序。
5.
'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/'.
6.
'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)!
7.
'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''的)。
8.
'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''.
9.
'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)記。
10.
'nocase|NC' (忽略大小寫 no case)
它使Pattern忽略大小寫,即, 在Pattern與當(dāng)前URL匹配時(shí),'A-Z' 和'a-z'沒(méi)有區(qū)別。
11.
'qsappend|QSA' (追加請(qǐng)求串 query string append)
此標(biāo)記強(qiáng)制重寫引擎在已有的替換串中追加一個(gè)請(qǐng)求串,而不是簡(jiǎn)單的替換。 如果需要通過(guò)重寫規(guī)則在請(qǐng)求串中增加信息,就可以使用這個(gè)標(biāo)記。
12.
'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\%3d$1 [R,NE]
可以使'/foo/zed'轉(zhuǎn)向到一個(gè)安全的請(qǐng)求'/bar?arg=P1=zed'.
13.
'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)記?;旌鲜褂胢od_alias和mod_rewrite就是個(gè)典型的例子。
For Apache hackers
如果當(dāng)前Apache API除了URI到文件名hook之外,還有一個(gè)文件名到文件名的hook, 就不需要這個(gè)標(biāo)記了! 但是,如果沒(méi)有這樣一個(gè)hook,則此標(biāo)記是唯一的解決方案。 Apache Group討論過(guò)這個(gè)問(wèn)題,并在Apache 2.0 版本中會(huì)增加這樣一個(gè)hook。
14.
'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)記是不同的!)
15.
'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中剝離并記住一些信息。
16.
'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' (設(shè)置cookie)
它在客戶端瀏覽器上設(shè)置一個(gè)cookie。 cookie的名稱是NAME,其值是VAL。 domain字段是該cookie的域,比如'.apache.org', 可選的lifetime是cookie生命期的分鐘數(shù), 可選的path是cookie的路徑。