REWRITE偽靜態
一、Apache配置:
進入/etc/httpd/conf/目錄下,打開httpd.conf文件。
啟用rewrite
# LoadModule rewrite_module modules/mod_rewrite.so 去除前面的 #
啟用.htaccess AllowOverride None 修改為: AllowOverride All
--------------------------------------------------------------------------------
二、Rewrite寫法
服務器有配置文件不可能由我們來改,所以大多情況下要在網站的根目錄下建一個.htaccess文件。
RewriteEngine on //啟動rewrite引擎
RewriteRule ^/index([0-9]*).html$ /index.php?id=$1 //“([0-9]*)” 代表范圍 用(.*)代表所有,下同。
RewriteRule ^/index([0-9]*)/$ /index.php?id=$1 [R] //虛擬目錄
--------------------------------------------------------------------------------
三、mod_rewrite 規則修正符
1) R 強制外部重定向
2) F 禁用URL,返回403HTTP狀態碼。
3) G 強制URL為GONE,返回410HTTP狀態碼。
4) P 強制使用代理轉發。
5) L 表明當前規則是最后一條規則,停止分析以后規則的重寫。
6) N 重新從第一條規則開始運行重寫過程。
7) C 與下一條規則關聯,如果規則匹配則正常處理,以下修正符無效
8) T=MIME-type(force MIME type) 強制MIME類型
9) NS 只用于不是內部子請求
10) NC 不區分大小寫
11) QSA 追加請求字符串
12) NE 不在輸出轉義特殊字符 \%3d$1 等價于 =$1
ISAPI_Rewrite規則寫法
常見ISAPI_Rewrite規則寫法
復制代碼 代碼如下:
# 排除當前虛擬主機需要正常訪問的域名(web.3637.com www.3637.com)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數情況下是一個,即當前提供二級域名服務的系統(如建站系統)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規范目錄(末尾無/)的問題
# 但前提是目錄名不含‘.'而文件名必須包含,否則無法區分兩者
# 如果保證URL中的目錄名稱規范,則無需此規則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級域名名稱(即第一個詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫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]
# 排除當前虛擬主機需要正常訪問的域名(web.3637.com www.3637.com)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數情況下是一個,即當前提供二級域名服務的系統(如建站系統)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規范目錄(末尾無/)的問題
# 但前提是目錄名不含‘.'而文件名必須包含,否則無法區分兩者
# 如果保證URL中的目錄名稱規范,則無需此規則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級域名名稱(即第一個詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫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文件示例
復制代碼 代碼如下:
[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]
這一指令定義一個條件規則,在 RewriteRule 或者 RewriteHeader或 RewriteProxy指令前預行RewriteCond指令,后面的規則 只有它的,模式匹配URI的當前狀態并且額外的條件也被應用才會被應用。
TestVerb
Specifies verb that will be matched against regular expression.
特別定義的動詞匹配規定的表達式
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
得到更多的關于HTTP頭文件的和他們的值的信息參考RFC2068
ServerVariable 返回特定義的服務器變量的值 。例如服務器端口,全部服務器變量列表應在IIS文檔中建立,變量名應用%符預定;
CondPattern
The regular expression to match TestVerb
規則表達式匹配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]
這個指令可以不止發生一次,每個指令定義一個單獨的重寫規則,這些規則的定義命令很重要,因為這個命令在應用運行時規則是有用途的
I (ignore case)
不管大小寫強行指定字符匹配,這個FLAG影響RewriteRule指令和相應的RewriteCond 指令
F (Forbidden)
對客戶端做反應,停止REWRITING進程并且發送403錯誤,注意在這種情況下FORMATSTRING 是無用的并可以設置為任何非空字符串。
L (last rule)
不應用任何重寫規則在此停止重寫進程,使用這個FLAG以阻止當前被重寫的URI被后面的規則再次重寫
N (Next iteration)
強制REWRITINGENGINE調整規則目標并且從頭重啟規則檢查(所有修改將保存),重啟次數由RepeatLimit指定的值限制,如果這個數值超過N FLAG將被忽略
NS (Next iteration of the same rule)
以N標記工作不從相同的規則重啟規則規則進程(例如強制重復規則應用),通過RepeatLimit指令指定一個反復實行某一規則的最大數目,
P (force proxy)
強制目的URI在內部強制為代理需求并且立即通過ISAPI擴展應付代理需求,必須確認代理字符串是一個有效的URI包括協議 主機等等否則代理將返回錯誤
R (explicit redirect)
強制服務器對客戶端發出重定向指示即時應答,提供目的URI的新地址,重定向規則經常是最后規則
RP (permanent redirect)
幾乎和[R]標記相同但是發布301HTTP狀態而不是302HTTP狀態代碼
U (Unmangle Log)
當URI是源需求而不是重寫需求時記載URI
O (nOrmalize)
在實行之前標準化字符串。標準化包括URL-ENCODING,不合法的字符的再移動等,這個標記對于URLS和URLS-ENDODED頭是有用的
CL (Case Lower)
小寫
CU (Case Upper)
大寫
RewriteHeader directive
Syntax: RewriteHeader HeaderName Pattern FormatString [Flags]
這個指令是RewriteRule的更概括化變種,它不僅重寫URL的客戶端需求部分,而且重寫HTTP頭,這個指令不僅用于重寫。生成,刪除任何HTTP頭,甚至改變客戶端請求的方法
HeaderName
指定將被重寫的客戶頭,可取的值與 RewriteCond 指令中TestVerb參數相同
Pattern
限定規則表達式以匹配Request-URI,
FormatString
限定將生成新的URI的FormatString
[Flags]
是一個下列FLAGS的命令分隔列表
I (ignore case)
不管大小寫強行指定字符匹配,這個FLAG影響RewriteRule指令和相應的RewriteCond 指令
F (Forbidden)
對客戶端做反應,停止REWRITING進程并且發送403錯誤,注意在這種情況下FORMATSTRING 是無用的并可以設置為任何非空字符串。
L (last rule)
不應用任何重寫規則在此停止重寫進程,使用這個FLAG以阻止當前被重寫的URI被后面的規則再次重寫
N (Next iteration)
強制REWRITINGENGINE調整規則目標并且從頭重啟規則檢查(所有修改將保存),重啟次數由RepeatLimit指定的值限制,如果這個數值超過N FLAG將被忽略
NS (Next iteration of the same rule)
以N標記工作不從相同的規則重啟規則規則進程(例如強制重復規則應用),通過RepeatLimit指令指定一個反復實行某一規則的最大數目,
R (explicit redirect)
強制服務器對客戶端發出重定向指示即時應答,提供目的URI的新地址,重定向規則經常是最后規則
RP (permanent redirect)
幾乎和[R]標記相同但是發布301HTTP狀態而不是302HTTP狀態代碼
U (Unmangle Log)
當URI是源需求而不是重寫需求時記載URI
O (nOrmalize)
在實行之前標準化字符串。標準化包括URL-ENCODING,不合法的字符的再移動等,這個標記對于URLS和URLS-ENDODED頭是有用的
CL (Case Lower)
小寫
CU (Case Upper)
大寫
要重移動頭,FORMAT STRING模式應該生成一個空字符串,例如這一規則將從客戶請求中重移代理