相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- 階梯電費(fèi)計(jì)算公式—階梯電費(fèi)計(jì)算excel - 廣東東莞電費(fèi)收費(fèi)標(biāo)準(zhǔn)
- Macbook怎么開發(fā)PHP?Macbook 上 PHP 集成環(huán)境軟件大揭秘!
- apache 設(shè)置expires和max-age緩存
- 讓你的電腦就恢復(fù)到剛買時(shí)候的速度?甚至更快?!
- 落地式三分頻ASW超低音箱的設(shè)計(jì)與制作
- Zend Studio 10正式版破解及漢化
- 修改 .htaccess 實(shí)現(xiàn) 301 重定向
- Apache中 RewriteRule 規(guī)則參數(shù)介紹 》
- 如何對(duì)PNG進(jìn)行壓縮?PNG24壓縮方法
- Tomcat服務(wù)無(wú)法啟動(dòng)的問題的解決方法
Apache中 RewriteRule 規(guī)則參數(shù)介紹
Apache中 RewriteRule 規(guī)則參數(shù)介紹
摘要: Apache模塊 mod_rewrite 提供了一個(gè)基于正則表達(dá)式分析器的重寫引擎來(lái)實(shí)時(shí)重寫URL請(qǐng)求。它支持每個(gè)完整規(guī)則可以擁有不限數(shù)量的子規(guī)則以及附加條件規(guī)則的靈活而且強(qiáng)大的URL操作機(jī)制。這里著重介紹 RewriteRule 規(guī)則以及參數(shù)說(shuō)明。
Apache模塊 mod_rewrite 提供了一個(gè)基于正則表達(dá)式分析器的重寫引擎來(lái)實(shí)時(shí)重寫URL請(qǐng)求。它支持每個(gè)完整規(guī)則可以擁有不限數(shù)量的子規(guī)則以及附加條件規(guī)則的靈活而且強(qiáng)大的URL操作機(jī)制。此URL操作可以依賴于各種測(cè)試,比如服務(wù)器變量、環(huán)境變量、HTTP頭、時(shí)間標(biāo)記,甚至各種格式的用于匹配URL組成部分的查找數(shù)據(jù)庫(kù)。
此模塊可以操作URL的所有部分(包括路徑信息部分),在服務(wù)器級(jí)的(httpd.conf)和目錄級(jí)的(.htaccess)配置都有效,還可以生成最終請(qǐng)求字符串。此重寫操作的結(jié)果可以是內(nèi)部子處理,也可以是外部請(qǐng)求的轉(zhuǎn)向,甚至還可以是內(nèi)部代理處理。
這里著重介紹一下 RewriteRule 的規(guī)則以及參數(shù)說(shuō)明。RewriteRule指令是重寫引擎的根本。此指令可以多次使用。每個(gè)指令定義一個(gè)簡(jiǎn)單的重寫規(guī)則。這些規(guī)則的定義順序尤為重要——在運(yùn)行時(shí),規(guī)則是按這個(gè)順序逐一生效的。
RewriteRule Pattern Substitution [flags]
Pattern是一個(gè)作用于當(dāng)前URL的perl兼容的正則表達(dá)式。"當(dāng)前URL"是指該規(guī)則生效時(shí)刻的URL的值。它可能與被請(qǐng)求的URL截然不同,因?yàn)槠渌?guī)則可能在此之前已經(jīng)發(fā)生匹配并對(duì)它做了改動(dòng)。
Substitution是當(dāng)原始URL與Pattern相匹配時(shí),用來(lái)替代(或替換)的字符串。除了純文本,還可以包含:對(duì)Pattern的反向引用($N) 對(duì)最后匹配的RewriteCond的反向引用(%N) 規(guī)則條件測(cè)試字符串(%{VARNAME})中的服務(wù)器變量 映射函數(shù)調(diào)用(${mapname:key|default})
[flags]標(biāo)記作為RewriteRule指令的第三個(gè)參數(shù),是一個(gè)包含以逗號(hào)分隔的下列標(biāo)記的列表:'chain|C'(鏈接下一規(guī)則)此標(biāo)記使當(dāng)前規(guī)則與下一個(gè)規(guī)則相鏈接。它產(chǎn)生這樣的效果:如果一個(gè)規(guī)則被匹配,則繼續(xù)處理其后繼規(guī)則,也就是這個(gè)標(biāo)記不起作用;如果該規(guī)則不被匹配,則其后繼規(guī)則將被跳過。比如,在一個(gè)目錄級(jí)規(guī)則中執(zhí)行一個(gè)外部重定向時(shí),你可能需要?jiǎng)h除".www"(此處不應(yīng)該出現(xiàn)".www")。 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(設(shè)置cookie)在客戶端設(shè)置一個(gè)cookie。cookie的名稱是NAME,值是VAL。domain是該cookie的域,比如'.apache.org',可選的lifetime是cookie的有效期(分鐘),可選的path是cookie的路徑。 'env|E=VAR:VAL'(設(shè)置環(huán)境變量)此標(biāo)記將環(huán)境變量VAR的值為VAL,VAL可以包含可擴(kuò)展的正則表達(dá)式反向引用($N和%N)。此標(biāo)記可以多次使用以設(shè)置多個(gè)變量。這些變量可以在其后許多情況下被間接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后繼的RewriteCond指令的CondPattern參數(shù)中通過%{ENV:VAR}引用。使用它可以記住從URL中剝離的信息。 'forbidden|F'(強(qiáng)制禁止URL)強(qiáng)制禁止當(dāng)前URL,也就是立即反饋一個(gè)HTTP響應(yīng)碼403(被禁止的)。使用這個(gè)標(biāo)記,可以鏈接若干個(gè)RewriteConds來(lái)有條件地阻塞某些URL。 'gone|G'(強(qiáng)制廢棄URL)強(qiáng)制當(dāng)前URL為已廢棄,也就是立即反饋一個(gè)HTTP響應(yīng)碼410(已廢棄的)。使用這個(gè)標(biāo)記,可以標(biāo)明頁(yè)面已經(jīng)被廢棄而不存在了。 'handler|H=Content-handler'(強(qiáng)制指定內(nèi)容處理器)強(qiáng)自制定目標(biāo)文件的內(nèi)容處理器為Content-handler。例如,用來(lái)模擬mod_alias模塊的ScriptAlias指令,以強(qiáng)制映射文件夾內(nèi)的所有文件都由"cgi-script"處理器處理。 'last|L'(結(jié)尾規(guī)則)立即停止重寫操作,并不再應(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'(從頭再來(lái))重新執(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)! 'nocase|NC'(忽略大小寫)它使Pattern忽略大小寫,也就是在Pattern與當(dāng)前URL匹配時(shí),'A-Z'和'a-z'沒有區(qū)別。 'noescape|NE'(在輸出中不對(duì)URI進(jìn)行轉(zhuǎn)義)此標(biāo)記阻止mod_rewrite對(duì)重寫結(jié)果應(yīng)用常規(guī)的URI轉(zhuǎn)義規(guī)則。 一般情況下,特殊字符('%', '$', ';'等)會(huì)被轉(zhuǎn)義為等值的十六進(jìn)制編碼('%25', '%24', '%3B'等)。此標(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'。 'nosubreq|NS'(不對(duì)內(nèi)部子請(qǐng)求進(jìn)行處理)在當(dāng)前請(qǐng)求是一個(gè)內(nèi)部子請(qǐng)求時(shí),此標(biāo)記強(qiáng)制重寫引擎跳過該重寫規(guī)則。比如,在mod_include試圖搜索目錄默認(rèn)文件(index.xxx)時(shí),Apache會(huì)在內(nèi)部產(chǎn)生子請(qǐng)求。對(duì)于子請(qǐng)求,重寫規(guī)則不一定有用,而且如果整個(gè)規(guī)則集都起作用,它甚至可能會(huì)引發(fā)錯(cuò)誤。所以,可以用這個(gè)標(biāo)記來(lái)排除某些規(guī)則。使用原則:如果你為URL添加了CGI腳本前綴,以強(qiáng)制它們由CGI腳本處理,但對(duì)子請(qǐng)求處理的出錯(cuò)率(或者資源開銷)很高,在這種情況下,可以使用這個(gè)標(biāo)記。 'proxy|P'(強(qiáng)制為代理)此標(biāo)記使替換成分被內(nèi)部地強(qiáng)制作為代理請(qǐng)求發(fā)送,并立即中斷重寫處理,然后把處理移交給mod_proxy模塊。你必須確保此替換串是一個(gè)能夠被mod_proxy處理的有效URI(比如以http://hostname開頭),否則將得到一個(gè)代理模塊返回的錯(cuò)誤。使用這個(gè)標(biāo)記,可以把某些遠(yuǎn)程成分映射到本地服務(wù)器域名空間,從而增強(qiáng)了ProxyPass指令的功能。 注意:要使用這個(gè)功能,必須已經(jīng)啟用了mod_proxy模塊。'passthrough|PT'(移交給下一個(gè)處理器)此標(biāo)記強(qiáng)制重寫引擎將內(nèi)部request_rec結(jié)構(gòu)中的uri字段設(shè)置為filename字段的值,這個(gè)小小的修改使得RewriteRule指令的輸出能夠被(從URI轉(zhuǎn)換到文件名的)Alias, ScriptAlias, Redirect等指令進(jìn)行后續(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.]。舉一個(gè)能說(shuō)明其含義的例子: 如果要將/abc重寫為/def, 然后再使用mod_alias將/def轉(zhuǎn)換為/ghi,可以這樣:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果省略了PT標(biāo)記,雖然將uri=/abc/...重寫為filename=/def/...的部分運(yùn)作正常,但是后續(xù)的mod_alias在試圖將URI轉(zhuǎn)換到文件名時(shí)會(huì)遭遇失效。 注意:如果需要混合使用多個(gè)將URI轉(zhuǎn)換到文件名的模塊時(shí),就必須使用這個(gè)標(biāo)記。。此處混合使用mod_alias和mod_rewrite就是個(gè)典型的例子。'qsappend|QSA'(追加查詢字符串)此標(biāo)記強(qiáng)制重寫引擎在已有的替換字符串中追加一個(gè)查詢字符串,而不是簡(jiǎn)單的替換。如果需要通過重寫規(guī)則在請(qǐng)求串中增加信息,就可以使用這個(gè)標(biāo)記。 'redirect|R [=code]'(強(qiáng)制重定向)若Substitution以http://thishost[:thisport]/(使新的URL成為一個(gè)URI)開頭,可以強(qiáng)制性執(zhí)行一個(gè)外部重定向。如果沒有指定code,則產(chǎn)生一個(gè)HTTP響應(yīng)碼302(臨時(shí)性移動(dòng))。如果需要使用在300-400范圍內(nèi)的其他響應(yīng)代碼,只需在此指定即可(或使用下列符號(hào)名稱之一:temp(默認(rèn)), permanent, seeother)。使用它可以把規(guī)范化的URL反饋給客戶端,如將"/~"重寫為"/u/",或始終對(duì)/u/user加上斜杠,等等。注意:在使用這個(gè)標(biāo)記時(shí),必須確保該替換字段是一個(gè)有效的URL。否則,它會(huì)指向一個(gè)無(wú)效的位置!并且要記住,此標(biāo)記本身只是對(duì)URL加上http://thishost[:thisport]/前綴,重寫操作仍然會(huì)繼續(xù)進(jìn)行。通常,你還會(huì)希望停止重寫操作而立即重定向,那么就還需要使用'L'標(biāo)記。 'skip|S=num'(跳過后繼規(guī)則)此標(biāo)記強(qiáng)制重寫引擎跳過當(dāng)前匹配規(guī)則之后的num個(gè)規(guī)則。它可以模擬if-then-else結(jié)構(gòu):最后一個(gè)規(guī)則是then從句,而被跳過的skip=N個(gè)規(guī)則是else從句。注意:它和'chain|C'標(biāo)記是不同的! 'type|T=MIME-type'(強(qiáng)制MIME類型)強(qiáng)制目標(biāo)文件的MIME類型為MIME-type,可以用來(lái)基于某些特定條件強(qiáng)制設(shè)置內(nèi)容類型。比如,下面的指令可以讓.php文件在以.phps擴(kuò)展名調(diào)用的情況下由mod_php按照PHP源代碼的MIME類型(application/x-httpd-php-source)顯示:
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
RewriteRule example
1.If http://example.com/foo/bar does not exist, redirect tohttp://other.example.com/foo/bar. (Put this in an .htaccess file in your top-level web directory.)
# .htaccess in root of example.com
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://other.example.com/$1 [R]
2. Handle all requests for top-level .html files and files with no extensions (http://example.com/foo, http://example.com/foo.html) with a single PHP program/foo/show.php. Also, ignore trailing characters in set { : ; , . } so URLs like "http://example.com/foo." can be copied-n-pasted from plain text sentences by inattentive users.
# .htaccess in root of example.com
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]
Examples:
http://www.updateweb.cn/rewriterule
http://www.updateweb.cn/rewriterule.html;
3. Redirect GET requests for http://example.com/foo/bar tohttp://example.com/bar (and /foo/bar.html to /bar.html). Handle POST requests with PHP program rather than attempting to redirect a POST (which is unlikely to work well).
# .htaccess in foo folder in example.com's document root
RewriteEngine On
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /$1 [R,L,NS]
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]
Examples:
http://updateweb.cn/w/rewriterule
http://updateweb.cn/w/rewriterule.html;
Apache Rewrite 規(guī)則詳解
1、Rewrite規(guī)則簡(jiǎn)介:
Rewirte主要的功能就是實(shí)現(xiàn)URL的跳轉(zhuǎn),它的正則表達(dá)式是基于Perl語(yǔ)言??苫诜?wù)器級(jí)的(httpd.conf)和目錄級(jí)的(.htaccess)兩種方式。如果要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時(shí)候就直接安裝rewrite模塊,別一種是編譯apache時(shí)以DSO模式安裝apache,然后再利用源碼和apxs來(lái)安裝rewrite模塊。
基于服務(wù)器級(jí)的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來(lái)打開rewrite功能;另一種是在局部里利用RewriteEngine on來(lái)打開rewrite功能,下面將會(huì)舉例說(shuō)明,需要注意的是,必須在每個(gè)virtualhost里用RewriteEngine on來(lái)打開rewrite功能。否則virtualhost里沒有RewriteEngine on它里面的規(guī)則也不會(huì)生效。
基于目錄級(jí)的(.htaccess),要注意一點(diǎn)那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess里要聲明RewriteEngine on。
2、舉例說(shuō)明:
下面是在一個(gè)虛擬主機(jī)里定義的規(guī)則。功能是把client請(qǐng)求的主機(jī)前綴不是www.updateweb.cn和203.81.23.202都跳轉(zhuǎn)到主機(jī)前綴為http://www.updateweb.cn,避免當(dāng)用戶在地址欄寫入http://updateweb.cn時(shí)不能以會(huì)員方式登錄網(wǎng)站。
NameVirtualHost 192.168.100.8:80
ServerAdmin
DocumentRoot "/web/webapp"
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打開rewirte功能
RewriteCond %{HTTP_HOST} !^www.updateweb.cn [NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是]的意思是忽略大小寫
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是203.81.23.202,[NC]的意思是忽略大小寫
RewriteCond %{HTTP_HOST} !^$ #聲明Client請(qǐng)求的主機(jī)中前綴不為空,[NC]的意思是忽略大小寫
RewriteRule ^/(.*) http://www.updateweb.cn/ [L] #含義是如果Client請(qǐng)求的主機(jī)中的前綴符合上述條件,則直接進(jìn)行跳轉(zhuǎn)到]意味著立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。這里的.*是指匹配所有URL中不包含換行字符,()括號(hào)的功能是把所有的字符做一個(gè)標(biāo)記,以便于后面的應(yīng)用.就是引用前面里的(.*)字符。
例二.將輸入 folio.test.com 的域名時(shí)跳轉(zhuǎn)到profile.test.com
listen 8080
NameVirtualHost 10.122.89.106:8080
ServerAdmin
DocumentRoot "/usr/local/www/apache22/data1/"
ServerName profile.test.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.updateweb.cn[NC]
RewriteRule ^/(.*) http://www.updateweb.cn/ [L]
3.Apache mod_rewrite規(guī)則重寫的標(biāo)志一覽
1) R[=code](force redirect) 強(qiáng)制外部重定向強(qiáng)制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL.如果code不指定,將用缺省的302 HTTP狀態(tài)碼。2) F(force URL to be forbidden)禁用URL,返回403HTTP狀態(tài)碼。3) G(force URL to be gone) 強(qiáng)制URL為GONE,返回410HTTP狀態(tài)碼。4) P(force proxy) 強(qiáng)制使用代理轉(zhuǎn)發(fā)。5) L(last rule) 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫。6) N(next round) 重新從第一條規(guī)則開始運(yùn)行重寫過程。7) C(chained with next rule) 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,該標(biāo)志無(wú)效,如果不匹配,那么下面所有關(guān)聯(lián)的規(guī)則都跳過。
8) T=MIME-type(force MIME type) 強(qiáng)制MIME類型9) NS (used only if no internal sub-request) 只用于不是內(nèi)部子請(qǐng)求10) NC(no case) 不區(qū)分大小寫11) QSA(query string append) 追加請(qǐng)求字符串12) NE(no URI escaping of output) 不在輸出轉(zhuǎn)義特殊字符例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 將能正確的將/foo/zoo轉(zhuǎn)換成/bar?arg=P1=zed13) PT(pass through to next handler) 傳遞給下一個(gè)處理例如:RewriteRule ^/abc(.*) /def$1 [PT] # 將會(huì)交給/def規(guī)則處理Alias /def /ghi 14) S=num(skip next rule(s)) 跳過num條規(guī)則15) E=VAR:VAL(set environment variable) 設(shè)置環(huán)境變量
4.Apache rewrite例子集合
在 httpd 中將一個(gè)域名轉(zhuǎn)發(fā)到另一個(gè)域名虛擬主機(jī)世界近期更換了域名,新域名為 www.updateweb.cn, 更加簡(jiǎn)短好記。這時(shí)需要將原來(lái)的域名updateweb.cn, 以及論壇所在地址 updateweb.cn/forums/定向到新的域名,以便用戶可以找到,并且使原來(lái)的論壇 URL 繼續(xù)有效而不出現(xiàn) 404 未找到,比如原來(lái)的http://www.updateweb.cn/forums/-f60.html, 讓它在新的域名下繼續(xù)有效,點(diǎn)擊后轉(zhuǎn)發(fā)到http://bbs.updateweb.cn/-f60.html, 這就需要用 apache 的 Mod_rewrite 功能來(lái)實(shí)現(xiàn)。
在中添加下面的重定向規(guī)則:
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
添加了上面的規(guī)則以后, 里的全部?jī)?nèi)容如下:
ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
ServerName www.webhosting-world.com
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
URL重定向
例子一:
1.http://www.zzz.com/xxx.php-> http://www.taobaoxs.com/xxx/2.http://yyy.zzz.com-> http://www.taobaoxs.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.taobaoxs.com
RewriteCond %{REQUEST_URI} !^user\.php$
RewriteCond %{REQUEST_URI} \.php$
RewriteRule (.*)\.php$ http://www.taobaoxs.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.taobaoxs.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^\.]+)\.zzz\.com http://www.taobaoxs.com/user.php?username=$1
例子二:
/type.php?typeid=* --> /type*.html/type.php?typeid=*&page=* --> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
5.使用Apache的URL Rewrite配置多用戶虛擬服務(wù)器
要實(shí)現(xiàn)這個(gè)功能,首先要在DNS服務(wù)器上打開域名的泛域名解析(自己做或者找域名服務(wù)商做)。比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的這臺(tái)Linux Server上。
然后,看一下我的Apache中關(guān)于*.semcase.com的虛擬主機(jī)的設(shè)定。
#*.com,*.osall.net
ServerAdmin
DocumentRoot /home/www/www.taobaoxs.com
ServerName dns.semcase.com
ServerAlias dns.semcase.com taobaoxs.com semcase.net *.taobaoxs.com *.semcase.net
CustomLog /var/log/httpd/osa/access_log.log" common
ErrorLog /var/log/httpd/osa/error_log.log"
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$
/home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
在這段設(shè)定中,我把*.semcase.net和*.semcase.com 的Document Root都設(shè)定到了 /home/www/www.taobaoxs.com
但是,繼續(xù)看下去,看到...配置了嗎?在這里我就配置了URL Rewrite規(guī)則。RewriteEngine on #打開URL Rewrite功能RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配條件,如果用戶輸入的URL中主機(jī)名是類似 xxxx.semcase.com 或者 xxxx.semcase.cn 就執(zhí)行下面一句RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用戶輸入完整的地址(GET方式的參數(shù)除外)作為參數(shù)傳給下一個(gè)規(guī)則,[C]是Chain串聯(lián)下一個(gè)規(guī)則的意思RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]# 最關(guān)鍵的是這一句,使用證則表達(dá)式解析用戶輸入的URL地址,把主機(jī)名中的用戶名信息作為名為un的參數(shù)傳給/home/www/dev.semcase.com目錄下的腳本,并在后面跟上用戶輸入的GET方式的傳入?yún)?shù)。并指明這是最后一條規(guī)則([L]規(guī)則)。注意,在這一句中指明的重寫后的地址用的是服務(wù)器上的絕對(duì)路徑,這是內(nèi)部跳轉(zhuǎn)。如果使用http://xxxx這樣的URL格式,則被稱為外部跳轉(zhuǎn)。使用外部跳轉(zhuǎn)的話,瀏覽著的瀏覽器中的URL地址會(huì)改變成新的地址,而使用內(nèi)部跳轉(zhuǎn)則瀏覽器中的地址不發(fā)生改變,看上去更像實(shí)際的二級(jí)域名虛擬服務(wù)器。
這樣設(shè)置后,重啟Apache服務(wù)器,測(cè)試一下,就大功告成了!
13 個(gè)mod_rewrite 應(yīng)用舉例
1.給子域名加www標(biāo)記 RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L] 這個(gè)規(guī)則抓取二級(jí)域名的%1變量,如果不是以www開始,那么就加www,以前的域名以及{REQUEST_URI}會(huì)跟在其后。2.去掉域名中的www標(biāo)記 RewriteCond %{HTTP_HOST} !^example\.com$ [NC] RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]3.去掉www標(biāo)記,但是保存子域名 RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC] RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]這里,當(dāng)匹配到1%變量以后,子域名才會(huì)在%2(內(nèi)部原子)中抓取到,而我們需要的正是這個(gè)%1變量。 4.防止圖片盜鏈 一些站長(zhǎng)不擇手段的將你的圖片盜鏈在他們網(wǎng)站上,耗費(fèi)你的帶寬。你可以加一下代碼阻止這種行為。 RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC] RewriteRule \.(gif|jpg|png)$ - [F] 如果{HTTP_REFERER}值不為空,或者不是來(lái)自你自己的域名,這個(gè)規(guī)則用[F]FLAG阻止以gif|jpg|png 結(jié)尾的URL 如果對(duì)這種盜鏈你是堅(jiān)決鄙視的,你還可以改變圖片,讓訪問盜鏈網(wǎng)站的用戶知道該網(wǎng)站正在盜用你的圖片。 RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] RewriteRule \.(gif|jpg|png)$ 你的圖片地址 [R=301,L] 除了阻止圖片盜鏈鏈接,以上規(guī)則將其盜鏈的圖片全部替換成了你設(shè)置的圖片。 你還可以阻止特定域名盜鏈你的圖片: RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.com/ [NC] RewriteRule \.(gif|jpg|png)$ - [F,L]這個(gè)規(guī)則將阻止域名黑名單上所有的圖片鏈接請(qǐng)求。 當(dāng)然以上這些規(guī)則都是以{HTTP_REFERER}獲取域名為基礎(chǔ)的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。5.如果文件不存在重定向到404頁(yè)面 如果你的主機(jī)沒有提供404頁(yè)面重定向服務(wù),那么我們自己創(chuàng)建。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .? /404.php [L] 這里-f匹配的是存在的文件名,-d匹配的存在的路徑名。這段代碼在進(jìn)行404重定向之前,會(huì)判斷你的文件名以及路徑名是否存在。你還可以在404頁(yè)面上加一個(gè)?url=$1參數(shù): RewriteRule ^/?(.*)$ /404.php?url=$1 [L]這樣,你的404頁(yè)面就可以做一些其他的事情,例如默認(rèn)信心,發(fā)一個(gè)郵件提醒,加一個(gè)搜索,等等。6.重命名目錄如果你想在網(wǎng)站上重命名目錄,試試這個(gè): RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]在規(guī)則里我添加了一個(gè)“.”(注意不是代表得所有字符,前面有轉(zhuǎn)義符)來(lái)匹配文件的后綴名。 7.將.html后綴名轉(zhuǎn)換成.php前提是.html文件能繼續(xù)訪問的情況下,更新你的網(wǎng)站鏈接。 RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]這不是一個(gè)網(wǎng)頁(yè)重定向,所以訪問者是不可見的。讓他作為一個(gè)永久重定向(可見的),將FLAG修改[R=301,L]。 8.創(chuàng)建無(wú)文件后綴名鏈接如果你想使你的PHP網(wǎng)站的鏈接更加簡(jiǎn)潔易記-或者隱藏文件的后綴名,試試這個(gè): RewriteRule ^/?([a-z]+)$ $1.php [L]如果網(wǎng)站混有PHP以及HTML文件,你可以用RewriteCond先判斷該后綴的文件是否存在,然后進(jìn)行替換: 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]如果文件是以.php為后綴,這條規(guī)則將被執(zhí)行。9.檢查查詢變量里的特定參數(shù)如果在URL里面有一個(gè)特殊的參數(shù),你可用RewriteCond鑒別其是否存在: RewriteCond %{QUERY_STRING} !uniquekey= RewriteRule ^/?script_that_requires_uniquekey\.php$ other_script.php [QSA,L]以上規(guī)則將檢查{QUERY_STRING}里面的uniquekey參數(shù)是否存在,如果{REQUEST_URI}值為script_that_requires_uniquekey,將會(huì)定向到新的URL。 10.刪除查詢變量Apache的mod_rewrite模塊會(huì)自動(dòng)辨識(shí)查詢變量,除非你做了以下改動(dòng): a).分配一個(gè)新的查詢參數(shù)(你可以用[QSA,L]FLAG保存最初的查詢變量) b).在文件名后面加一個(gè)“?”(比如index.php?)。符號(hào)“?”不會(huì)在瀏覽器的地址欄里顯示。11.用新的格式展示當(dāng)前URI 如果這就是我們當(dāng)前正在運(yùn)行的URLs:/index.php?id=nnnn。我們非常希望將其更改成/nnnn并且讓搜索引擎以新格式展現(xiàn)。首先,我們?yōu)榱俗屗阉饕娓鲁尚碌?,得將舊的URLs重定向到新的格式,但是,我們還得保證以前的index.php照樣能夠運(yùn)行。是不是被我搞迷糊了? 實(shí)現(xiàn)以上功能,訣竅就在于在查詢變量中加了一個(gè)訪問者看不到的標(biāo)記符“marker”。我們只將查詢變量中沒有出現(xiàn)“marker”標(biāo)記的鏈接進(jìn)行重定向,然后將原有的鏈接替換成新的格式,并且通過[QSA]FLAG在已有的參數(shù)加一個(gè)“marker”標(biāo)記。以下為實(shí)現(xiàn)的方式: RewriteCond %{QUERY_STRING} !marker RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+) RewriteRule ^/?index\.php$ %1? [R=301,L] RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?marker &id=$1 [L]這里,原先的URL:http://www.example.com/index.php?id=nnnn,不包含marker,所以被第一個(gè)規(guī)則永久重定向到http://www.example.com/nnnn,第二個(gè)規(guī)則將http://www.example.com/nnnn反定向到http://www.example.com/index.php?marker &id=nnnn,并且加了marker以及id=nnnn兩個(gè)變量,最后mod_rewrite就開始進(jìn)行處理過程。第二次匹配,marker被匹配,所以忽略第一條規(guī)則,這里有一個(gè)“.”字符會(huì)出現(xiàn)在http://www.example.com/index.php?marker &id=nnnn中,所以第二條規(guī)則也會(huì)被忽略,這樣我們就完成了。注意,這個(gè)解決方案要求Apache的一些擴(kuò)展功能,所以如果你的網(wǎng)站放于在共享主機(jī)中會(huì)遇到很多障礙。12.保證安全服務(wù)啟用Apache可以用兩種方法辨別你是否開啟了安全服務(wù),分別引用{HTTPS}和{SERVER_PORT}變量:RewriteCond %{REQUEST_URI} ^secure_page\.php$ RewriteCond %{HTTPS} !on RewriteRule ^/?(secure_page\.php)$ https://www.taobaoxs.com/$1 [R=301,L]以上規(guī)則測(cè)試{REQUEST_URI}值是否等于我們的安全頁(yè)代碼,并且{HTTPS}不等于on。如果這兩個(gè)條件同時(shí)滿足,請(qǐng)求將被重定向到安全服務(wù)URI.另外你可用{SERVER_PORT}做同樣的測(cè)試,443是常用的安全服務(wù)端口 RewriteCond %{REQUEST_URI} ^secure_page\.php$ RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/?(secure_page\.php)$ https://www.taobaoxs.com/$1 [R=301,L]13.在特定的頁(yè)面上強(qiáng)制執(zhí)行安全服務(wù) 遇到同一個(gè)服務(wù)器根目錄下分別有一個(gè)安全服務(wù)域名和一個(gè)非安全服務(wù)域名,所以你就需要用RewriteCond 判斷安全服務(wù)端口是否占用,并且只將以下列表的頁(yè)面要求為安全服務(wù): RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www.taobaoxs.com/%1 [R=301,L] 以下是怎樣將沒有設(shè)置成安全服務(wù)的頁(yè)面返回到80端口: RewriteCond %{ SERVER_PORT } ^443$ RewriteRule !^/?(page6|page7|page8|page9)$ taobaoxs.com%{REQUEST_URI} [R=301,L]