REWRITE偽靜態(tài)
一、Apache配置:
進(jìn)入/etc/httpd/conf/目錄下,打開(kāi)httpd.conf文件。
啟用rewrite
# LoadModule rewrite_module modules/mod_rewrite.so 去除前面的 #
啟用.htaccess AllowOverride None 修改為: AllowOverride All
--------------------------------------------------------------------------------
二、Rewrite寫(xiě)法
服務(wù)器有配置文件不可能由我們來(lái)改,所以大多情況下要在網(wǎng)站的根目錄下建一個(gè).htaccess文件。
RewriteEngine on //啟動(dòng)rewrite引擎
RewriteRule ^/index([0-9]*).html$ /index.php?id=$1 //“([0-9]*)” 代表范圍 用(.*)代表所有,下同。
RewriteRule ^/index([0-9]*)/$ /index.php?id=$1 [R] //虛擬目錄
--------------------------------------------------------------------------------
三、mod_rewrite 規(guī)則修正符
1) R 強(qiáng)制外部重定向
2) F 禁用URL,返回403HTTP狀態(tài)碼。
3) G 強(qiáng)制URL為GONE,返回410HTTP狀態(tài)碼。
4) P 強(qiáng)制使用代理轉(zhuǎn)發(fā)。
5) L 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫(xiě)。
6) N 重新從第一條規(guī)則開(kāi)始運(yùn)行重寫(xiě)過(guò)程。
7) C 與下一條規(guī)則關(guān)聯(lián),如果規(guī)則匹配則正常處理,以下修正符無(wú)效
8) T=MIME-type(force MIME type) 強(qiáng)制MIME類型
9) NS 只用于不是內(nèi)部子請(qǐng)求
10) NC 不區(qū)分大小寫(xiě)
11) QSA 追加請(qǐng)求字符串
12) NE 不在輸出轉(zhuǎn)義特殊字符 \%3d$1 等價(jià)于 =$1
ISAPI_Rewrite規(guī)則寫(xiě)法
常見(jiàn)ISAPI_Rewrite規(guī)則寫(xiě)法
復(fù)制代碼代碼如下:
# 排除當(dāng)前虛擬主機(jī)需要正常訪問(wèn)的域名(web.3637.com www.3637.com)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數(shù)情況下是一個(gè),即當(dāng)前提供二級(jí)域名服務(wù)的系統(tǒng)(如建站系統(tǒng))
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規(guī)范目錄(末尾無(wú)/)的問(wèn)題
# 但前提是目錄名不含‘.'而文件名必須包含,否則無(wú)法區(qū)分兩者
# 如果保證URL中的目錄名稱規(guī)范,則無(wú)需此規(guī)則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級(jí)域名名稱(即第一個(gè)詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫(xiě)Url到Home/子目錄下
# 如 test.3637.com => web.3637.com/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]
[ISAPI_Rewrite]
RepeatLimit 1
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
# 排除當(dāng)前虛擬主機(jī)需要正常訪問(wèn)的域名(web.3637.com www.3637.com)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數(shù)情況下是一個(gè),即當(dāng)前提供二級(jí)域名服務(wù)的系統(tǒng)(如建站系統(tǒng))
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規(guī)范目錄(末尾無(wú)/)的問(wèn)題
# 但前提是目錄名不含‘.'而文件名必須包含,否則無(wú)法區(qū)分兩者
# 如果保證URL中的目錄名稱規(guī)范,則無(wú)需此規(guī)則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級(jí)域名名稱(即第一個(gè)詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫(xiě)Url到Home/子目錄下
# 如 test.3637.com => web.3637.com/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]
HTTPD.INI文件示例
復(fù)制代碼代碼如下:
[ISAPI_Rewrite]
# This is a comment
# 300 = 5 minutes
CacheClockRate 300
RepeatLimit 20
# Block external access to the httpd.ini and httpd.parse.errors files
RewriteRule /httpd(?:.ini|.parse.errors) / [F,I,O]
# Block external access to the Helper ISAPI Extension
RewriteRule .*.isrwhlp / [F,I,O]
# Some custom rules
RewriteCond Host: (.+)
RewriteCond 指令
Syntax:(句法) RewriteCond TestVerb CondPattern [Flags]
這一指令定義一個(gè)條件規(guī)則,在 RewriteRule 或者 RewriteHeader或 RewriteProxy指令前預(yù)行RewriteCond指令,后面的規(guī)則 只有它的,模式匹配URI的當(dāng)前狀態(tài)并且額外的條件也被應(yīng)用才會(huì)被應(yīng)用。
TestVerb
Specifies verb that will be matched against regular expression.
特別定義的動(dòng)詞匹配規(guī)定的表達(dá)式
TestVerb=(URL | METHOD | VERSION | HTTPHeaderName: | %ServerVariable) where:
URL - returns Request-URI of client request as described in RFC 2068 (HTTP 1.1);
返回客戶端在RFC2068中描述的需求的Request-URI
METHOD - returns HTTP method of client request (OPTIONS, GET, HEAD, POST, PUT, DELETE or TRACE);
返回客戶端需求(OPTIONS, GET, HEAD, POST, PUT, DELETE or TRACE)的HTTP方法
VERSION - returns HTTP version;
返回HTTP版本
HTTPHeaderName - returns value of the specified HTTP header. HTTPHeaderName can be any valid HTTP header name. Header names should include the trailing colon ":". If specified header does not exists in a client's request TestVerb is treated as empty string.
返回特定義的HTTP頭文件的值
HTTPHeaderName =
Accept:
Accept-Charset:
Accept-Encoding:
Accept-Language:
Authorization:
Cookie:
From:
Host:
If-Modified-Since:
If-Match:
If-None-Match:
If-Range:
If-Unmodified-Since:
Max-Forwards:
Proxy-Authorization:
Range:
Referer:
User-Agent:
Any-Custom-Header
得到更多的關(guān)于HTTP頭文件的和他們的值的信息參考RFC2068
ServerVariable 返回特定義的服務(wù)器變量的值 。例如服務(wù)器端口,全部服務(wù)器變量列表應(yīng)在IIS文檔中建立,變量名應(yīng)用%符預(yù)定;
CondPattern
The regular expression to match TestVerb
規(guī)則表達(dá)式匹配TestVerb
[Flags]
Flags is a comma-separated list of the following flags:
O (nOrmalize)
Normalizes string before processing. Normalization includes removing of an URL-encoding, illegal characters, etc. This flag is useful with URLs and URL-encoded headers
RewriteRule 指令
Syntax: RewriteRule Pattern FormatString [Flags]
這個(gè)指令可以不止發(fā)生一次,每個(gè)指令定義一個(gè)單獨(dú)的重寫(xiě)規(guī)則,這些規(guī)則的定義命令很重要,因?yàn)檫@個(gè)命令在應(yīng)用運(yùn)行時(shí)規(guī)則是有用途的
I (ignore case)
不管大小寫(xiě)強(qiáng)行指定字符匹配,這個(gè)FLAG影響RewriteRule指令和相應(yīng)的RewriteCond 指令
F (Forbidden)
對(duì)客戶端做反應(yīng),停止REWRITING進(jìn)程并且發(fā)送403錯(cuò)誤,注意在這種情況下FORMATSTRING 是無(wú)用的并可以設(shè)置為任何非空字符串。
L (last rule)
不應(yīng)用任何重寫(xiě)規(guī)則在此停止重寫(xiě)進(jìn)程,使用這個(gè)FLAG以阻止當(dāng)前被重寫(xiě)的URI被后面的規(guī)則再次重寫(xiě)
N (Next iteration)
強(qiáng)制REWRITINGENGINE調(diào)整規(guī)則目標(biāo)并且從頭重啟規(guī)則檢查(所有修改將保存),重啟次數(shù)由RepeatLimit指定的值限制,如果這個(gè)數(shù)值超過(guò)N FLAG將被忽略
NS (Next iteration of the same rule)
以N標(biāo)記工作不從相同的規(guī)則重啟規(guī)則規(guī)則進(jìn)程(例如強(qiáng)制重復(fù)規(guī)則應(yīng)用),通過(guò)RepeatLimit指令指定一個(gè)反復(fù)實(shí)行某一規(guī)則的大數(shù)目,
P (force proxy)
強(qiáng)制目的URI在內(nèi)部強(qiáng)制為代理需求并且立即通過(guò)ISAPI擴(kuò)展應(yīng)付代理需求,必須確認(rèn)代理字符串是一個(gè)有效的URI包括協(xié)議 主機(jī)等等否則代理將返回錯(cuò)誤
R (explicit redirect)
強(qiáng)制服務(wù)器對(duì)客戶端發(fā)出重定向指示即時(shí)應(yīng)答,提供目的URI的新地址,重定向規(guī)則經(jīng)常是最后規(guī)則
RP (permanent redirect)
幾乎和[R]標(biāo)記相同但是發(fā)布301HTTP狀態(tài)而不是302HTTP狀態(tài)代碼
U (Unmangle Log)
當(dāng)URI是源需求而不是重寫(xiě)需求時(shí)記載URI
O (nOrmalize)
在實(shí)行之前標(biāo)準(zhǔn)化字符串。標(biāo)準(zhǔn)化包括URL-ENCODING,不合法的字符的再移動(dòng)等,這個(gè)標(biāo)記對(duì)于URLS和URLS-ENDODED頭是有用的
CL (Case Lower)
小寫(xiě)
CU (Case Upper)
大寫(xiě)
RewriteHeader directive
Syntax: RewriteHeader HeaderName Pattern FormatString [Flags]
這個(gè)指令是RewriteRule的更概括化變種,它不僅重寫(xiě)URL的客戶端需求部分,而且重寫(xiě)HTTP頭,這個(gè)指令不僅用于重寫(xiě)。生成,刪除任何HTTP頭,甚至改變客戶端請(qǐng)求的方法
HeaderName
指定將被重寫(xiě)的客戶頭,可取的值與 RewriteCond 指令中TestVerb參數(shù)相同
Pattern
限定規(guī)則表達(dá)式以匹配Request-URI,
FormatString
限定將生成新的URI的FormatString
[Flags]
是一個(gè)下列FLAGS的命令分隔列表
I (ignore case)
不管大小寫(xiě)強(qiáng)行指定字符匹配,這個(gè)FLAG影響RewriteRule指令和相應(yīng)的RewriteCond 指令
F (Forbidden)
對(duì)客戶端做反應(yīng),停止REWRITING進(jìn)程并且發(fā)送403錯(cuò)誤,注意在這種情況下FORMATSTRING 是無(wú)用的并可以設(shè)置為任何非空字符串。
L (last rule)
不應(yīng)用任何重寫(xiě)規(guī)則在此停止重寫(xiě)進(jìn)程,使用這個(gè)FLAG以阻止當(dāng)前被重寫(xiě)的URI被后面的規(guī)則再次重寫(xiě)
N (Next iteration)
強(qiáng)制REWRITINGENGINE調(diào)整規(guī)則目標(biāo)并且從頭重啟規(guī)則檢查(所有修改將保存),重啟次數(shù)由RepeatLimit指定的值限制,如果這個(gè)數(shù)值超過(guò)N FLAG將被忽略
NS (Next iteration of the same rule)
以N標(biāo)記工作不從相同的規(guī)則重啟規(guī)則規(guī)則進(jìn)程(例如強(qiáng)制重復(fù)規(guī)則應(yīng)用),通過(guò)RepeatLimit指令指定一個(gè)反復(fù)實(shí)行某一規(guī)則的大數(shù)目,
R (explicit redirect)
強(qiáng)制服務(wù)器對(duì)客戶端發(fā)出重定向指示即時(shí)應(yīng)答,提供目的URI的新地址,重定向規(guī)則經(jīng)常是最后規(guī)則
RP (permanent redirect)
幾乎和[R]標(biāo)記相同但是發(fā)布301HTTP狀態(tài)而不是302HTTP狀態(tài)代碼
U (Unmangle Log)
當(dāng)URI是源需求而不是重寫(xiě)需求時(shí)記載URI
O (nOrmalize)
在實(shí)行之前標(biāo)準(zhǔn)化字符串。標(biāo)準(zhǔn)化包括URL-ENCODING,不合法的字符的再移動(dòng)等,這個(gè)標(biāo)記對(duì)于URLS和URLS-ENDODED頭是有用的
CL (Case Lower)
小寫(xiě)
CU (Case Upper)
大寫(xiě)
要重移動(dòng)頭,F(xiàn)ORMAT STRING模式應(yīng)該生成一個(gè)空字符串,例如這一規(guī)則將從客戶請(qǐng)求中重移代理