一、apache rewrite 服務(wù)器變量 引用方法:%{ NAME_OF_VARIABLE }
HTTP headers 部分: HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT connection & request 部分: REMOTE_ADDR REMOTE_HOST REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE server internals部分: DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE system stuff 部分: TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME specials部分: API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ 特別注意事項: 1:SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的,即,Apache服務(wù)器的內(nèi)部request_rec結(jié)構(gòu)中的 filename字段。 第一個其實就是大家都知道的CGI變量名,而第二個則是(包含了request_rec結(jié)構(gòu)中的uri字段的)REQUEST_URI的一個副本, 2:特殊形式: %{ENV:variable} 其中的variable可以是任何環(huán)境變量。 它是通過查找Apache內(nèi)部結(jié)構(gòu)得到的, 或者(如果沒找到的話)是由Apache服務(wù)器進程通過getenv()得到的。 3:特殊形式: %{HTTP:header} 其中的header可以是任何HTTP MIME頭的名稱。 它是通過查找HTTP請求得到的。比如: %{HTTP:Proxy-Connection}就是HTTP頭 “Proxy-Connection:”的值. 4:特殊形式 %{LA-U:variable} 它是一個預(yù)設(shè)的值, variable的最終值在執(zhí)行一個內(nèi)部的(基于URL的)子請求后決定。在重寫需要使用一個尚未有效的但是會在之后的API程序段中設(shè)置的變量的時候,就會使用這個方法。比如,需要在服務(wù)器級配置(httpd.conf文件)中重寫REMOTE_USER變量,則,必須使用%{LA- U:REMOTE_USER},因為此變量是由認(rèn)證程序段設(shè)置的,而這個程序段是在mod_rewrite所在的URL轉(zhuǎn)譯程序段之后才執(zhí)行的。但是,因為mod_rewrite是通過API修正程序段來實現(xiàn)目錄級(.htaccess file)配置的,而這個程序段在認(rèn)證程序段之前就執(zhí)行了,所以用%{REMOTE_USER}就可以了。 5:特殊形式: %{LA-F:variable} 它是一個預(yù)設(shè)的值, variable的最終值在執(zhí)行一個內(nèi)部的(基于文件名的)子請求后決定。 大多數(shù)情況下和上述的LA-U是相同的.
二、apache rewrite 正則表達(dá)式的說明 . 匹配任何單字符 [chars] 匹配字符串:chars [^chars] 不匹配字符串:chars text1|text2 可選擇的字符串:text1或text2 匹配0到1個字符 * 匹配0到多個字符 + 匹配1到多個字符 ^ 字符串開始標(biāo)志 $ 字符串結(jié)束標(biāo)志 \n 轉(zhuǎn)義符標(biāo)志 反向引用 $N 用于 RewriteRule 中匹配的變量調(diào)用(0 <= N <= 9) 反向引用 %N 用于 RewriteCond 中最后一個匹配的變量調(diào)用(1 <= N <= 9)
三、apache rewrite 規(guī)則后面的標(biāo)志符說明 1:RewriteCond標(biāo)志符 nocase|NC (no case)忽略大小 ornext|OR (or next condition)邏輯或,可以同時匹配多個RewriteCond條件 2:RewriteRule適用的標(biāo)志符 redirect|R [=code] (force redirect)強迫重寫為基于http開頭的外部轉(zhuǎn)向(注意URL的變化) 如:[R=301,L] forbidden|F (force URL to be forbidden)重寫為禁止訪問 proxy|P (force proxy)重寫為通過代理訪問的http路徑 last|L (last rule)最后的重寫規(guī)則標(biāo)志,如果匹配,不再執(zhí)行以后的規(guī)則 next|N (next round)循環(huán)同一個規(guī)則,直到不能滿足匹配 chain|C (chained with next rule)如果匹配該規(guī)則,則繼續(xù)下面的有Chain標(biāo)志的規(guī)則。 type|T=MIME-type (force MIME type)指定MIME類型 nosubreq|NS (used only if no internal sub-request)如果是內(nèi)部子請求則跳過 nocase|NC (no case)忽略大小 qsappend|QSA (query string append)附加查詢字符串 noescape|NE (no URI escaping of output)禁止URL中的字符自動轉(zhuǎn)義成%[0-9]+的形式。 passthrough|PT (pass through to next handler)將重寫結(jié)果運用于mod_alias skip|S=num (skip next rule(s))跳過下面幾個規(guī)則 env|E=VAR:VAL (set environment variable)添加環(huán)境變
四,Apache Rewrite 一些實例 打開apache rewrite 包括兩種情況 1:在httpd.conf全局中打開 RewriteEngine on 2: 局部里利用RewriteEngine on來打開rewrite功能 3: 基于目錄級的(.htaccess),要注意一點那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess里要聲明RewriteEngine on。
1:以下是實例說明:,115.47.151.223 為前綴的跳轉(zhuǎn)到 www. RewriteEngine on #打開rewirte功能 RewriteCond %{HTTP_HOST} !^ [NC] #聲明Client請求的主機中前綴不是,[NC]的意思是忽略大小寫 RewriteCond %{HTTP_HOST} !^115.47.151.223 [NC] #聲明Client請求的主機中前綴不是115.47.151.223,[NC]的意思是忽略大小寫 RewriteCond %{HTTP_HOST} !^$ #聲明Client請求的主機中前綴不為空,[NC]的意思是忽略大小寫 RewriteRule ^/(.*) http://www./ [L] #含義是如果Client請求的主機中的前綴符合上述條件,則直接進行跳轉(zhuǎn)到http://www./, [L]意味著立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。這里的.*是指匹配所有URL中不包含換行字符,()括號的功能是把所有的字符做一個標(biāo)記,以便 于后面的應(yīng)用.就是引用前面里的(.*)字符。 2: http://www./forums/-f60.html => http://bbs./-f60.html RewriteEngine On # Redirect /forums to bbs. RewriteCond %{REQUEST_URI} ^/forums/ RewriteRule /forums/(.*) http://bbs./$1 [R=permanent,L] # Redirect to RewriteCond %{REQUEST_URI} !^/forums/ RewriteRule /(.*) http://www./$1 [R=permanent,L] 3:http://www./xxx.php->; http://www./xxx/ 和 http://yyy.->http://www./user.php?username=yyy RewriteEngine On RewriteCond %{HTTP_HOST} ^www. RewriteCond %{REQUEST_URI} !^user\.php$ RewriteCond %{REQUEST_URI} \.php$ RewriteRule (.*)\.php$ http://www./$1/ [R] RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.+) %{HTTP_HOST} [C] RewriteRule ^([^\.]+)\.zzz\.com http://www./user.php?username=$1 4:/type.php?typeid=* ?> /type*.html 和 /type.php?typeid=*&page=* ?> /type*page*.html RewriteEngine On 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:泛域名,二級域名虛擬服務(wù)器 RewriteEngine on RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$ #匹配條件,如果用戶輸入的URL中主機名是類似 xxxx.semcase.com 或者 xxxx.semcase.cn 就執(zhí)行下面一句 RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用戶輸入完整的地址(GET方式的參數(shù)除外)作為參數(shù)傳給下一個規(guī)則,[C]是Chain串聯(lián)下一個規(guī)則的意思 RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L] # 最關(guān)鍵的是這一句,使用證則表達(dá)式解析用戶輸入的URL地址,把主機名中的用戶名信息作為名為un的參數(shù)傳給 /home/www/dev.semcase.com目錄下的腳本,并在后面跟上用戶輸入的GET方式的傳入?yún)?shù)。并指明這是最后一條規(guī)則([L]規(guī)則) 6:瀏覽器為IE和Opera的訪客將被禁止訪問 ewriteEngine on!?S5IG LOj RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]_R N/7\ RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]!&’ # a RewriteRule ^.* - [F,L] 這里”-”表示沒有替換。 7:限制目錄只能顯示圖片 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$ RewriteRule .*$ - [F,L]
|