日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Apache中 RewriteRule 规则参数介绍

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache中 RewriteRule 规则参数介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、Apache中 RewriteRule 規(guī)則參數(shù)介紹 ?

Apache模塊 mod_rewrite 提供了一個基于正則表達(dá)式分析器的重寫引擎來實(shí)時重寫URL請求。它支持每個完整規(guī)則可以擁有不限數(shù)量的子規(guī)則以及附加條件規(guī)則的靈活而且強(qiáng)大的URL操作機(jī)制。此URL操作可以依賴于各種測試,比如服務(wù)器變量、環(huán)境變量、HTTP頭、時間標(biāo)記,甚至各種格式的用于匹配URL組成部分的查找數(shù)據(jù)庫。

此模塊可以操作URL的所有部分(包括路徑信息部分),在服務(wù)器級的(httpd.conf)和目錄級的(.htaccess)配置都有效,還可以生成最終請求字符串。此重寫操作的結(jié)果可以是內(nèi)部子處理,也可以是外部請求的轉(zhuǎn)向,甚至還可以是內(nèi)部代理處理。

這里著重介紹一下?RewriteRule?的規(guī)則以及參數(shù)說明。RewriteRule指令是重寫引擎的根本。此指令可以多次使用。每個指令定義一個簡單的重寫規(guī)則。這些規(guī)則的定義順序尤為重要——在運(yùn)行時,規(guī)則是按這個順序逐一生效的。

??????? RewriteRule Pattern Substitution [flags]

1、Pattern是一個作用于當(dāng)前URL的perl兼容的正則表達(dá)式。"當(dāng)前URL"是指該規(guī)則生效時刻的URL的值。它可能與被請求的URL截然不同,因為其他規(guī)則可能在此之前已經(jīng)發(fā)生匹配并對它做了改動。

2、Substitution是當(dāng)原始URL與Pattern相匹配時,用來替代(或替換)的字符串。除了純文本,還可以包含:
????? 對Pattern的反向引用($N)?
????? 對最后匹配的RewriteCond的反向引用(%N)?
????? 規(guī)則條件測試字符串(%{VARNAME})中的服務(wù)器變量?
????? 映射函數(shù)調(diào)用(${mapname:key|default})

3、[flags]標(biāo)記作為RewriteRule指令的第三個參數(shù),是一個包含以逗號分隔的下列標(biāo)記的列表:
??? (1)'chain|C'(鏈接下一規(guī)則)
??? 此標(biāo)記使當(dāng)前規(guī)則與下一個規(guī)則相鏈接。它產(chǎn)生這樣的效果:如果一個規(guī)則被匹配,則繼續(xù)處理其后繼規(guī)則,也就是這個標(biāo)記不起作用;如果該規(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的路徑。?
??? (2)'env|E=VAR:VAL'(設(shè)置環(huán)境變量)
??? 此標(biāo)記將環(huán)境變量VAR的值設(shè)為VAL,VAL可以包含可擴(kuò)展的正則表達(dá)式反向引用($N和%N)。此標(biāo)記可以多次使用以設(shè)置多個變量。這些變量可以在其后許多情況下被間接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后繼的RewriteCond指令的CondPattern參數(shù)中通過%{ENV:VAR}引用。使用它可以記住從URL中剝離的信息。?
??? (3)'forbidden|F'(強(qiáng)制禁止URL)
??? 強(qiáng)制禁止當(dāng)前URL,也就是立即反饋一個HTTP響應(yīng)碼403(被禁止的)。使用這個標(biāo)記,可以鏈接若干個RewriteConds來有條件地阻塞某些URL。?
??? (4)'gone|G'(強(qiáng)制廢棄URL)
??? 強(qiáng)制當(dāng)前URL為已廢棄,也就是立即反饋一個HTTP響應(yīng)碼410(已廢棄的)。使用這個標(biāo)記,可以標(biāo)明頁面已經(jīng)被廢棄而不存在了。?
??? (5)'handler|H=Content-handler'(強(qiáng)制指定內(nèi)容處理器)
??? 強(qiáng)自制定目標(biāo)文件的內(nèi)容處理器為Content-handler。例如,用來模擬mod_alias模塊的ScriptAlias指令,以強(qiáng)制映射文件夾內(nèi)的所有文件都由"cgi-script"處理器處理。?
??? (6)'last|L'(結(jié)尾規(guī)則)
??? 立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。它對應(yīng)于Perl中的last命令或C語言中的break命令。這個標(biāo)記用于阻止當(dāng)前已被重寫的URL被后繼規(guī)則再次重寫。例如,使用它可以重寫根路徑的URL('/')為實(shí)際存在的URL(比如:'/e/www/')。?
??? (7)'next|N'(從頭再來)
??? 重新執(zhí)行重寫操作(從第一個規(guī)則重新開始)。此時再次進(jìn)行處理的URL已經(jīng)不是原始的URL了,而是經(jīng)最后一個重寫規(guī)則處理過的URL。它對應(yīng)于Perl中的next命令或C語言中的continue命令。此標(biāo)記可以重新開始重寫操作(立即回到循環(huán)的開頭)。但是要小心,不要制造死循環(huán)!?
??? (8)'nocase|NC'(忽略大小寫)
??? 它使Pattern忽略大小寫,也就是在Pattern與當(dāng)前URL匹配時,'A-Z'和'a-z'沒有區(qū)別。?
??? (9)'noescape|NE'(在輸出中不對URI進(jìn)行轉(zhuǎn)義)
??? 此標(biāo)記阻止mod_rewrite對重寫結(jié)果應(yīng)用常規(guī)的URI轉(zhuǎn)義規(guī)則。 一般情況下,特殊字符('%', '$', ';'等)會被轉(zhuǎn)義為等值的十六進(jìn)制編碼('%25', '%24', '%3B'等)。此標(biāo)記可以阻止這樣的轉(zhuǎn)義,以允許百分號等符號出現(xiàn)在輸出中,比如:RewriteRule? /foo/(.*)? /bar?arg=P1\%3d$1? [R,NE] ,可以使'/foo/zed轉(zhuǎn)向到一個安全的請求'/bar?arg=P1=zed'。?
??? (10)'nosubreq|NS'(不對內(nèi)部子請求進(jìn)行處理)
??? 在當(dāng)前請求是一個內(nèi)部子請求時,此標(biāo)記強(qiáng)制重寫引擎跳過該重寫規(guī)則。比如,在mod_include試圖搜索目錄默認(rèn)文件(index.xxx)時,Apache會在內(nèi)部產(chǎn)生子請求。對于子請求,重寫規(guī)則不一定有用,而且如果整個規(guī)則集都起作用,它甚至可能會引發(fā)錯誤。所以,可以用這個標(biāo)記來排除某些規(guī)則。使用原則:如果你為URL添加了CGI腳本前綴,以強(qiáng)制它們由CGI腳本處理,但對子請求處理的出錯率(或者資源開銷)很高,在這種情況下,可以使用這個標(biāo)記。?
??? (11)'proxy|P'(強(qiáng)制為代理)
??? 此標(biāo)記使替換成分被內(nèi)部地強(qiáng)制作為代理請求發(fā)送,并立即中斷重寫處理,然后把處理移交給mod_proxy模塊。你必須確保此替換串是一個能夠被mod_proxy處理的有效URI(比如以http://hostname開頭),否則將得到一個代理模塊返回的錯誤。使用這個標(biāo)記,可以把某些遠(yuǎn)程成分映射到本地服務(wù)器域名空間,從而增強(qiáng)了ProxyPass指令的功能。?
??? 注意:要使用這個功能,必須已經(jīng)啟用了mod_proxy模塊。
??? (12)'passthrough|PT'(移交給下一個處理器)
??? 此標(biāo)記強(qiáng)制重寫引擎將內(nèi)部request_rec結(jié)構(gòu)中的uri字段設(shè)置為filename字段的值,這個小小的修改使得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.]。舉一個能說明其含義的例子: 如果要將/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)換到文件名時會遭遇失效。?
    ??? 注意:如果需要混合使用多個將URI轉(zhuǎn)換到文件名的模塊時,就必須使用這個標(biāo)記。。此處混合使用mod_alias和mod_rewrite就是個典型的例子。
    ??? (13)'qsappend|QSA'(追加查詢字符串)
    ??? 此標(biāo)記強(qiáng)制重寫引擎在已有的替換字符串中追加一個查詢字符串,而不是簡單的替換。如果需要通過重寫規(guī)則在請求串中增加信息,就可以使用這個標(biāo)記。?
    ??? (14)'redirect|R [=code]'(強(qiáng)制重定向)
    ??? 若Substitution以http://thishost[:thisport]/(使新的URL成為一個URI)開頭,可以強(qiáng)制性執(zhí)行一個外部重定向。如果沒有指定code,則產(chǎn)生一個HTTP響應(yīng)碼302(臨時性移動)。如果需要使用在300-400范圍內(nèi)的其他響應(yīng)代碼,只需在此指定即可(或使用下列符號名稱之一:temp(默認(rèn)), permanent, seeother)。使用它可以把規(guī)范化的URL反饋給客戶端,如將"/~"重寫為"/u/",或始終對/u/user加上斜杠,等等。
    ??? 注意:在使用這個標(biāo)記時,必須確保該替換字段是一個有效的URL。否則,它會指向一個無效的位置!并且要記住,此標(biāo)記本身只是對URL加上http://thishost[:thisport]/前綴,重寫操作仍然會繼續(xù)進(jìn)行。通常,你還會希望停止重寫操作而立即重定向,那么就還需要使用'L'標(biāo)記。?
    ??? (15)'skip|S=num'(跳過后繼規(guī)則)
    ??? 此標(biāo)記強(qiáng)制重寫引擎跳過當(dāng)前匹配規(guī)則之后的num個規(guī)則。它可以模擬if-then-else結(jié)構(gòu):最后一個規(guī)則是then從句,而被跳過的skip=N個規(guī)則是else從句。注意:它和'chain|C'標(biāo)記是不同的!?
    ??? (16)'type|T=MIME-type'(強(qiáng)制MIME類型)
    ??? 強(qiáng)制目標(biāo)文件的MIME類型為MIME-type,可以用來基于某些特定條件強(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 to?http://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?to?http://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ī)則簡介:

    Rewirte主要的功能就是實(shí)現(xiàn)URL的跳轉(zhuǎn),它的正則表達(dá)式是基于Perl語言。可基于服務(wù)器級的(httpd.conf)和目錄級的(.htaccess)兩種方式。如果要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時候就直接安裝rewrite模塊,別一種是編譯apache時以DSO模式安裝apache,然后再利用源碼和apxs來安裝rewrite模塊。

    基于服務(wù)器級的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來打開rewrite功能;另一種是在局部里利用RewriteEngine on來打開rewrite功能,下面將會舉例說明,需要注意的是,必須在每個virtualhost里用RewriteEngine on來打開rewrite功能。否則virtualhost里沒有RewriteEngine on它里面的規(guī)則也不會生效。

    基于目錄級的(.htaccess),要注意一點(diǎn)那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess里要聲明RewriteEngine on。

    2、舉例說明:

    下面是在一個虛擬主機(jī)里定義的規(guī)則。功能是把client請求的主機(jī)前綴不是www.abc.cn和203.81.23.202都跳轉(zhuǎn)到主機(jī)前綴為http://www.abc.cn,避免當(dāng)用戶在地址欄寫入http://abc.cn時不能以會員方式登錄網(wǎng)站。

  • NameVirtualHost 192.168.100.8:80

  • ServerAdmin
  • DocumentRoot "/web/webapp"
  • ServerName www.abc.com.cn
  • ServerName abc.com.cn
  • RewriteEngine on #打開rewirte功能
  • RewriteCond ? %{HTTP_HOST}?? !^www.abc.cn ? [NC]?? #聲明Client請求的主機(jī)中前綴不是www.abc.cn,[NC]的意思是忽略大小寫
  • RewriteCond ? %{HTTP_HOST}?? !^203.81.23.202 ? [NC] ? #聲明Client請求的主機(jī)中前綴不是203.81.23.202,[NC]的意思是忽略大小寫
  • RewriteCond ? %{HTTP_HOST} ? !^$ ? #聲明Client請求的主機(jī)中前綴不為空
  • RewriteRule?? ^/(.*)?? http://www.abc.cn/??[L]? #含義是如果Client請求的主機(jī)中的前綴符合上述條件,則直接進(jìn)行跳轉(zhuǎn)到http://www.abc.cn/,[L]意味著立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。這里的.*是指匹配所有URL中不包含換行字符,()括號的功能是把所有的字符做一個標(biāo)記,以便于后面的應(yīng)用。$1就是引用前面里的(.*)字符。
  • 例二.將輸入 folio.test.com 的域名時跳轉(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}?? ^folio.test.com? [NC]
  • RewriteRule ? ^/(.*)?? profile.test.com??[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)志無效,如果不匹配,那么下面所有關(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)部子請求
    ??? 10) NC(no case) 不區(qū)分大小寫
    ??? 11) QSA(query string append) 追加請求字符串
    ??? 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=zed
    ??? 13) PT(pass through to next handler) 傳遞給下一個處理
    ??????????? 例如:RewriteRule ^/abc(.*) /def$1 [PT] # 將會交給/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 中將一個域名轉(zhuǎn)發(fā)到另一個域名,新域名為?www.ab.com, 更加簡短好記。這時需要將原來的域名abc.cn, 以及論壇所在地址 abc.com/forums/定向到新的域名,以便用戶可以找到,并且使原來的論壇 URL 繼續(xù)有效而不出現(xiàn) 404 未找到,比如原來的http://www.abc.com/forums/f60.html, 讓它在新的域名下繼續(xù)有效,點(diǎn)擊后轉(zhuǎn)發(fā)到http://bbs.abc.com/f60.html, 這就需要用 apache 的 Mod_rewrite 功能來實(shí)現(xiàn)。

    在.htaccess中添加下面的重定向規(guī)則:

  • RewriteEngine On
  • # Redirect webhosting-abc.com/forums to bbs.abc.com
  • RewriteCond ? %{REQUEST_URI}?? ^/forums/
  • RewriteRule??? /forums/(.*)??? http://bbs.abc.com/$1?? [R=permanent,L]
  • # Redirect webhosting-abc.com to abc.com
  • RewriteCond ? %{REQUEST_URI} ? !^/forums/
  • RewriteRule?? /(.*) ? http://www.abc.com/$1 ? [R=permanent,L]
  • 5、URL重定向

    例子一:

    1.http://www.zzz.com/xxx.php->?http://www.zzz.com/xxx/
    2.http://yyy.zzz.com->?http://www.zzz.com/user.php?username=yyy?的功能

  • RewriteEngine On
  • RewriteCond ? %{HTTP_HOST}?? ^www.zzz.com
  • RewriteCond?? %{REQUEST_URI} ? !^user\.php$
  • RewriteCond?? %{REQUEST_URI} ? \.php$
  • RewriteRule ?? (.*)\.php$?? http://www.zzz.com/$1/ ?[R]
  • RewriteCond ? %{HTTP_HOST} ? !^www.zzz.com
  • RewriteRule ? ^(.+) %{HTTP_HOST}?? [C]
  • RewriteRule?? ^([^\.]+)\.zzz\.com?? http://www.zzz.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]
  • 6、使用Apache的URL Rewrite配置多用戶虛擬服務(wù)器

    要實(shí)現(xiàn)這個功能,首先要在DNS服務(wù)器上打開域名的泛域名解析(自己做或者找域名服務(wù)商做)。比如,我就把 *.zzz.com和 *.zzz.net全部解析到了我的這臺Linux Server上。

    然后,看一下我的Apache中關(guān)于*.zzz.com的虛擬主機(jī)的設(shè)定。

  • #*.com,*.zzz.net

  • ServerAdmin
  • DocumentRoot? /home/www/www.zzz.com
  • ServerName dns.zzz.com
  • ServerAlias dns.zzz.com zzz.com zzz.net *.zzz.com?*.zzz.net
  • CustomLog /var/log/httpd/zzz/access_log.log" common
  • ErrorLog /var/log/httpd/zzz/error_log.log"
  • AllowOverride None
  • Order deny,allow
  • #AddDefaultCharset GB2312


  • RewriteEngine on
  • RewriteCond ? %{HTTP_HOST}?? ^[^.]+\.zzz\.(com|net)$
  • RewriteRule?? ^(.+) %{HTTP_HOST}$1? [C]
  • RewriteRule?? ^([^.]+)\.zzz\.(com|net)(.*)$?? /home/www/www.zzz.com/sylvan$3?un=$1&%{QUERY_STRING}?? [L]
  • 在這段設(shè)定中,我把*.zzz.net和*.zzz.com 的Document Root都設(shè)定到了 /home/www/www.zzz.com

    但是,繼續(xù)看下去,我們配置了URL Rewrite規(guī)則。

    RewriteEngine on #打開URL Rewrite功能
    RewriteCond?? %{HTTP_HOST}?? ^[^.]+.zzz.(com|net)$??? #匹配條件,如果用戶輸入的URL中主機(jī)名是類似 xxxx.zzz.com 或者 xxxx.zzz.net 就執(zhí)行下面一句
    RewriteRule?? ^(.+) %{HTTP_HOST}$1 [C]??? #把用戶輸入完整的地址(GET方式的參數(shù)除外)作為參數(shù)傳給下一個規(guī)則,[C]是Chain串聯(lián)下一個規(guī)則的意思
    RewriteRule?? ^([^.]+)\.zzz\.(com|net)(.*)$ ? /home/www/www.zzz.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
    # 最關(guān)鍵的是這一句,使用證則表達(dá)式解析用戶輸入的URL地址,把主機(jī)名中的用戶名信息作為名為un的參數(shù)傳給/home/www/www.zzz.com目錄下的腳本,并在后面跟上用戶輸入的GET方式的傳入?yún)?shù)。并指明這是最后一條規(guī)則([L]規(guī)則)。注意,在這一句中指明的重寫后的地址用的是服務(wù)器上的絕對路徑,這是內(nèi)部跳轉(zhuǎn)。如果使用http://xxxx這樣的URL格式,則被稱為外部跳轉(zhuǎn)。使用外部跳轉(zhuǎn)的話,瀏覽著的瀏覽器中的URL地址會改變成新的地址,而使用內(nèi)部跳轉(zhuǎn)則瀏覽器中的地址不發(fā)生改變,看上去更像實(shí)際的二級域名虛擬服務(wù)器。

    這樣設(shè)置后,重啟Apache服務(wù)器,測試一下,就大功告成了!


    四、13 個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]?
    這個規(guī)則抓取二級域名的%1變量,如果不是以www開始,那么就加www,以前的域名以及{REQUEST_URI}會跟在其后。

    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%變量以后,子域名才會在%2(內(nèi)部原子)中抓取到,而我們需要的正是這個%1變量。?

    4.防止圖片盜鏈?
    一些站長不擇手段的將你的圖片盜鏈在他們網(wǎng)站上,耗費(fèi)你的帶寬。你可以加一下代碼阻止這種行為。?
    RewriteCond?? %{HTTP_REFERER}?? !^$?
    RewriteCond??? %{HTTP_REFERER} ? !^http://(www\.)?example\.com/?? [NC]?
    RewriteRule ? \.(gif|jpg|png)$?? - [F]?
    如果{HTTP_REFERER}值不為空,或者不是來自你自己的域名,這個規(guī)則用[F]FLAG阻止以gif|jpg|png 結(jié)尾的URL?
    如果對這種盜鏈你是堅決鄙視的,你還可以改變圖片,讓訪問盜鏈網(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]
    這個規(guī)則將阻止域名黑名單上所有的圖片鏈接請求。?
    當(dāng)然以上這些規(guī)則都是以{HTTP_REFERER}獲取域名為基礎(chǔ)的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。

    5.如果文件不存在重定向到404頁面?
    如果你的主機(jī)沒有提供404頁面重定向服務(wù),那么我們自己創(chuàng)建。?
    RewriteCond ? %{REQUEST_FILENAME}?? !-f?
    RewriteCond ? %{REQUEST_FILENAME} ? !-d?
    RewriteRule?? .??? /404.php ? [L]?
    這里-f匹配的是存在的文件名,-d匹配的存在的路徑名。這段代碼在進(jìn)行404重定向之前,會判斷你的文件名以及路徑名是否存在。你還可以在404頁面上加一個?url=$1參數(shù):?
    RewriteRule ^/?(.*)$ /404.php?url=$1 [L]
    這樣,你的404頁面就可以做一些其他的事情,例如默認(rèn)信心,發(fā)一個郵件提醒,加一個搜索,等等。

    6.重命名目錄
    如果你想在網(wǎng)站上重命名目錄,試試這個:?
    RewriteRule ? ^/?old_directory/([a-z/.]+)$?? new_directory/$1?? [R=301,L]
    在規(guī)則里我添加了一個“.”(注意不是代表得所有字符,前面有轉(zhuǎn)義符)來匹配文件的后綴名。?

    7.將.html后綴名轉(zhuǎn)換成.php
    前提是.html文件能繼續(xù)訪問的情況下,更新你的網(wǎng)站鏈接。?
    RewriteRule?? ^/?([a-z/]+)\.html$ ? $1.php ? [L]
    這不是一個網(wǎng)頁重定向,所以訪問者是不可見的。讓他作為一個永久重定向(可見的),將FLAG修改[R=301,L]。?

    8.創(chuàng)建無文件后綴名鏈接
    如果你想使你的PHP網(wǎng)站的鏈接更加簡潔易記-或者隱藏文件的后綴名,試試這個:?
    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里面有一個特殊的參數(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,將會定向到新的URL。?

    10.刪除查詢變量
    Apache的mod_rewrite模塊會自動辨識查詢變量,除非你做了以下改動:?
    a).分配一個新的查詢參數(shù)(你可以用[QSA,L]FLAG保存最初的查詢變量)?
    b).在文件名后面加一個“?”(比如index.php?)。符號“?”不會在瀏覽器的地址欄里顯示。

    11.用新的格式展示當(dāng)前URI?
    如果這就是我們當(dāng)前正在運(yùn)行的URLs:/index.php?id=nnnn。我們非常希望將其更改成/nnnn并且讓搜索引擎以新格式展現(xiàn)。首先,我們?yōu)榱俗屗阉饕娓鲁尚碌?#xff0c;得將舊的URLs重定向到新的格式,但是,我們還得保證以前的index.php照樣能夠運(yùn)行。
    實(shí)現(xiàn)以上功能,訣竅就在于在查詢變量中加了一個訪問者看不到的標(biāo)記符“marker”。我們只將查詢變量中沒有出現(xiàn)“marker”標(biāo)記的鏈接進(jìn)行重定向,然后將原有的鏈接替換成新的格式,并且通過[QSA]FLAG在已有的參數(shù)加一個“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,所以被第一個規(guī)則永久重定向到http://www.example.com/nnnn,第二個規(guī)則將http://www.example.com/nnnn反定向到http://www.example.com/index.php?marker&id=nnnn,并且加了marker以及id=nnnn兩個變量,最后mod_rewrite就開始進(jìn)行處理過程。
    第二次匹配,marker被匹配,所以忽略第一條規(guī)則,這里有一個“.”字符會出現(xiàn)在http://www.example.com/index.php?marker&id=nnnn中,所以第二條規(guī)則也會被忽略,這樣我們就完成了。
    注意,這個解決方案要求Apache的一些擴(kuò)展功能,所以如果你的網(wǎng)站放于在共享主機(jī)中會遇到很多障礙。

    12.保證安全服務(wù)啟用
    Apache可以用兩種方法辨別你是否開啟了安全服務(wù),分別引用{HTTPS}和{SERVER_PORT}變量:?
    RewriteCond?? %{REQUEST_URI}?? ^secure_page\.php$?
    RewriteCond?? %{HTTPS}?? !on?
    RewriteRule?? ^/?(secure_page\.php)$ ? https://www.zzz.com/$1 [R=301,L]
    以上規(guī)則測試{REQUEST_URI}值是否等于我們的安全頁代碼,并且{HTTPS}不等于on。如果這兩個條件同時滿足,請求將被重定向到安全服務(wù)URI.另外你可用{SERVER_PORT}做同樣的測試,443是常用的安全服務(wù)端口?
    RewriteCond??? %{REQUEST_URI}??? ^secure_page\.php$?
    RewriteCond ?? %{SERVER_PORT}??? !^443$?
    RewriteRule??? ^/?(secure_page\.php)$??? https://www.zzz.com/$1?? [R=301,L]

    13.在特定的頁面上強(qiáng)制執(zhí)行安全服務(wù)?
    遇到同一個服務(wù)器根目錄下分別有一個安全服務(wù)域名和一個非安全服務(wù)域名,所以你就需要用RewriteCond 判斷安全服務(wù)端口是否占用,并且只將以下列表的頁面要求為安全服務(wù):?
    RewriteCond??? %{SERVER_PORT}??? !^443$?
    RewriteRule??? ^/?(page1|page2|page3|page4|page5)$??? https://www.zzz.com/%1 ?[R=301,L]?
    以下是怎樣將沒有設(shè)置成安全服務(wù)的頁面返回到80端口:?
    RewriteCond??? %{ SERVER_PORT }?? ^443$?
    RewriteRule ? !^/?(page6|page7|page8|page9)$ ? zzz.com%{REQUEST_URI} [R=301,L]


    五、由于有些例子是針對特殊路徑或特別情況的,列出供大家在思路上參考。因為它們就是些例子。

    目標(biāo)重寫設(shè)置說明
    規(guī)范化URLRewriteRule?? ^/~([^/]+)/?(.*) ? /u/$1/$2 [R]將/~user重寫為/u/user的形式
    ?RewriteRule ? ^/([uge])/([^/]+)$ ? /$1/$2/ [R]將/u/user末尾漏掉的/補(bǔ)上
    ???
    規(guī)范化HostNameRewriteCond?? %{HTTP_HOST}?? !^fully\.qualified\.domain\.name ? [NC]域名不合格
    ?RewriteCond?? %{HTTP_HOST} ? !^$不空
    ?RewriteCond?? %{SERVER_PORT}?? !^80$不是80端口
    ?RewriteRule?? ^/(.*)?? http://fully.qualified.domain.name:%{SERVER_PORT}/$1?? [L,R]重寫
    ?RewriteCond ? %{HTTP_HOST}?? !^fully\.qualified\.domain\.name?? [NC]?
    ?RewriteCond?? %{HTTP_HOST} ? !^$?
    ?RewriteRule?? ^/(.*)?? http://fully.qualified.domain.name/$1 ? [L,R]?
    ???
    URL根目錄轉(zhuǎn)移RewriteEngine on?
    ?RewriteRule?? ^/$?? /e/www/ [R]從/移到/e/www/
    ???
    末尾目錄補(bǔ)斜線RewriteEngine on?
    (目錄范圍內(nèi))RewriteBase?? /~quux/?
    ?RewriteRule ? ^foo$?? foo/?? [R]/~quux/foo是一個目錄,補(bǔ)/
    ???
    ?RewriteEngine on?
    ?RewriteBase?? /~quux/?
    ?RewriteCond ? %{REQUEST_FILENAME}?? -d如果請文件名是個目錄
    ?RewriteRule?? ^(.+[^/])$?? $1/ [R]URL末尾不是斜線時補(bǔ)上
    ???
    Web集群RewriteEngine on?
    ?RewriteMap?? user-to-host?? txt:/path/to/map.user-to-host用戶-服務(wù)器映射
    ?RewriteMap?? group-to-host ? txt:/path/to/map.group-to-host組-服務(wù)器映射
    ?RewriteMap?? entity-to-host?? txt:/path/to/map.entity-to-host實(shí)體-服務(wù)器映射
    ?RewriteRule?? ^/u/([^/]+)/?(.*)?? http://${user-to-host:$1|server0}/u/$1/$2用戶均衡
    ?RewriteRule?? ^/g/([^/]+)/?(.*)?? http://${group-to-host:$1|server0}/g/$1/$2組均衡
    ?RewriteRule?? ^/e/([^/]+)/?(.*)?? http://${entity-to-host:$1|server0}/e/$1/$2實(shí)體均衡
    ?RewriteRule?? ^/([uge])/([^/]+)/?$?? /$1/$2/.www/?
    ?RewriteRule?? ^/([uge])/([^/]+)/([^.]+.+)?? /$1/$2/.www/$3\?
    ???
    URL根目錄搬遷RewriteEngine on?
    ?RewriteRule ? ^/~(.+)?? http://newserver/~$1 ? [R,L]到其它服務(wù)器
    ???
    所用戶名首字母分RewriteEngine on?
    ?RewriteRule?? ^/~(([a-z])[a-z0-9]+)(.*)?? /home/$2/$1/.www$3內(nèi)一層括號為$2
    ???
    NCSA imagemap移RewriteEngine on?
    植為mod_imapRewriteRule?? ^/cgi-bin/imagemap(.*)?? $1?? [PT]?
    ???
    多目錄查找資源RewriteEngine on?
    ?# first try to find it in custom/...?
    ?RewriteCond?? /your/docroot/dir1/%{REQUEST_FILENAME}?? -f?
    ?RewriteRule?? ^(.+) /your/docroot/dir1/$1 ? [L]?
    ?# second try to find it in pub/...?
    ?RewriteCond?? /your/docroot/dir2/%{REQUEST_FILENAME}?? -f?
    ?RewriteRule ? ^(.+)?? /your/docroot/dir2/$1?? [L]?
    ?# else go on for other Alias or ScriptAlias directives,?
    ?RewriteRule?? ^(.+)?? - [PT]?
    ???
    據(jù)URL設(shè)置環(huán)境變量RewriteEngine on?
    ?RewriteRule?? ^(.*)/S=([^/]+)/(.*)?? $1/$3 [E=STATUS:$2]?
    ???
    虛擬主機(jī)RewriteEngine on?
    ?RewriteCond ? %{HTTP_HOST} ? ^www\.[^.]+\.host\.com$基于用戶名
    ?RewriteRule?? ^(.+)?? %{HTTP_HOST}$1 ? [C]?
    ?RewriteRule?? ^www\.([^.]+)\.host\.com(.*)?? /home/$1$2?
    ???
    內(nèi)外人有別RewriteEngine on?
    ?RewriteCond?? %{REMOTE_HOST}?? !^.+\.ourdomain\.com$基于遠(yuǎn)程主機(jī)
    ?RewriteRule?? ^(/~.+) ? http://www.somewhere.com/$1?? [R,L]?
    ???
    錯誤重定向RewriteEngine on?
    ?RewriteCond ? /your/docroot/%{REQUEST_FILENAME}?? !-f不是regular文件
    ?RewriteRule?? ^(.+)?? http://webserverB.dom/$1?
    ???
    程序處理特殊協(xié)議RewriteRule ? ^xredirect:(.+)?? /path/to/nph-xredirect.cgi/$1 \Xredirect協(xié)議
    ?[T=application/x-httpd-cgi,L]?
    ???
    最近鏡像下載RewriteEngine on?
    ?RewriteMap?? multiplex?? txt:/path/to/map.cxan頂級域名與最近ftp服務(wù)器映射
    ?RewriteRule ? ^/CxAN/(.*)?? %{REMOTE_HOST}::$1 [C]?
    ?RewriteRule?? ^.+\.([a-zA-Z]+)::(.*)$?? ${multiplex:$1|ftp.default.dom}$2 ? [R,L]據(jù)頂級域名不同提供不同的FTP服務(wù)器
    ???
    基于時間重寫RewriteEngine on?
    ?RewriteCond?? %{TIME_HOUR}%{TIME_MIN}?? >0700?
    ?RewriteCond?? %{TIME_HOUR}%{TIME_MIN}?? <1900?
    ?RewriteRule ? ^foo\.html$ ? foo.day.html白天為早晚7點(diǎn)間
    ?RewriteRule?? ^foo\.html$ ? foo.night.html其余為夜間
    ???
    向前兼容擴(kuò)展名RewriteEngine on?
    ?RewriteBase /~quux/?
    ?# parse out basename, but remember the fact?
    ?RewriteRule?? ^(.*)\.html$?? $1?? [C,E=WasHTML:yes]?
    ?# rewrite to document.phtml if exists?
    ?RewriteCond?? %{REQUEST_FILENAME}.phtml -f如果存在$1.phtml則重寫
    ?RewriteRule ? ^(.*)$?? $1.phtml ? [S=1]?
    ?# else reverse the previous basename cutout?
    ?RewriteCond?? %{ENV:WasHTML} ? ^yes$如果不存在$1.phtml,則保持不變
    ?RewriteRule?? ^(.*)$?? $1.html?
    ???
    文件改名(目錄級)RewriteEngine on內(nèi)部重寫
    ?RewriteBase ? /~quux/?
    ?RewriteRule?? ^foo\.html$?? bar.html?
    ???
    ?RewriteEngine on重定向由客戶端再次提交
    ?RewriteBase?? /~quux/?
    ?RewriteRule ? ^foo\.html$ ? bar.html ? [R]?
    ???
    據(jù)瀏覽器類型重寫RewriteCond?? %{HTTP_USER_AGENT}?? ^Mozilla/3.*?
    ?RewriteRule ? ^foo\.html$ foo.NS.html?? [L]?
    ?RewriteCond?? %HTTP_USER_AGENT}?? ^Lynx/.* [OR]?
    ?RewriteCond?? %{HTTP_USER_AGENT}?? ^Mozilla/[12].*?
    ?RewriteRule ? ^foo\.html$ ? foo.20.html [L]?
    ?RewriteRule?? ^foo\.html$ ? foo.32.html [L]?
    ???
    動態(tài)鏡像遠(yuǎn)程資源RewriteEngine on?
    ?RewriteBase?? /~quux/?
    ?RewriteRule ? ^hotsheet/(.*)$?? http://www.tstimpreso.com/hotsheet/$1?? [P]利用了代理模塊
    ???
    ?RewriteEngine on?
    ?RewriteBase?? /~quux/?
    ?RewriteRule?? ^usa-news\.html$?? http://www.quux-corp.com/news/index.html [P]?
    ???
    反向動態(tài)鏡像RewriteEngine on?
    ?RewriteCond?? /mirror/of/remotesite/$1?? -U?
    ?RewriteRule?? ^http://www\.remotesite\.com/(.*)$ ? /mirror/of/remotesite/$1?
    ???
    負(fù)載均衡RewriteEngine on利用代理實(shí)現(xiàn)round-robin效果
    ?RewriteMap ? lb?? prg:/path/to/lb.pl?
    ?RewriteRule?? ^/(.+)$?? ${lb:$1} [P,L]?
    ???
    ?#!/path/to/perl?
    ?$| = 1;?
    ?$name = "www"; # the hostname base?
    ?$first = 1; # the first server (not 0 here, because 0 is myself)?
    ?$last = 5; # the last server in the round-robin?
    ?$domain = "foo.dom"; # the domainname?
    ?$cnt = 0;?
    ?while () {?
    ?$cnt = (($cnt+1) % ($last+1-$first));?
    ?$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);?
    ?print "http://$server/$_";?
    ?}?
    ?##EOF##?
    ???
    靜態(tài)頁面變腳本RewriteEngine on?
    ?RewriteBase?? /~quux/?
    ?RewriteRule?? ^foo\.html$ ? foo.cgi ? [T=application/x-httpd-cgi]?
    ???
    阻擊機(jī)器人RewriteCond ? %{HTTP_USER_AGENT}?? ^NameOfBadRobot.*?
    ?RewriteCond?? %{REMOTE_ADDR}?? ^123\.45\.67\.[8-9]$?
    ?RewriteRule?? ^/~quux/foo/arc/.+?? - [F]?
    ???
    阻止盜連你的圖片RewriteCond?? %{HTTP_REFERER}?? !^$?
    ?RewriteCond?? %{HTTP_REFERER} ? !^http://www.quux-corp.de/~quux/.*$ ? [NC]自己的連接可不能被阻止
    ?RewriteRule?? .*\.gif$?? - [F]?
    ???
    ?RewriteCond?? %{HTTP_REFERER}?? !^$?
    ?RewriteCond?? %{HTTP_REFERER}?? !.*/foo-with-gif\.html$?
    ?RewriteRule ? ^inlined-in-foo\.gif$ ? - [F]?
    ???
    拒絕某些主機(jī)訪問RewriteEngine on?
    ?RewriteMap?? hosts-deny?? txt:/path/to/hosts.deny?
    ?RewriteCond ? ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} ? !=NOT-FOUND?? [OR]?
    ?RewriteCond?? ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}?? !=NOT-FOUND?
    ?RewriteRule?? ^/.*?? - [F]?
    ???
    用戶授權(quán)RewriteCond?? %{REMOTE_IDENT}@%{REMOTE_HOST}?? !^friend1@client1.quux-corp\.com$?
    ?RewriteCond?? %{REMOTE_IDENT}@%{REMOTE_HOST}?? !^friend2@client2.quux-corp\.com$?
    ?RewriteCond?? %{REMOTE_IDENT}@%{REMOTE_HOST} ? !^friend3@client3.quux-corp\.com$?
    ?RewriteRule ? ^/~quux/only-for-friends/ ? - [F]?
    ???
    外部重寫程序模板RewriteEngine on?
    ?RewriteMap?? quux-map?? prg:/path/to/map.quux.pl?
    ?RewriteRule?? ^/~quux/(.*)$?? /~quux/${quux-map:$1}?
    ???
    ?#!/path/to/perl?
    ?$| = 1;?
    ?while (<>) {?
    ?s|^foo/|bar/|;?
    ?print $_;?
    ?}?
    ???
    搜索引擎友好RewriteRule?? ^/products$ ? /content.php?
    ?RewriteRule ? ^/products/([0-9]+)$ ? /content.php?id=$1?
    ?RewriteRule ? ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) ? /marso/content.php?id=$1&sort=$2&order=$3&start=$4?

    總結(jié)

    以上是生活随笔為你收集整理的Apache中 RewriteRule 规则参数介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。