Apache Web Server——RewriteRule
作者:張桂權
(摘自《
正則表達式袖珍手冊》一書。譯者,張桂權。可以從http://download.csdn.net/source/346896下載完整的譯稿。如果感覺不錯就去買一本原版的書吧,Regular Expression Pocket Reference,支持原書的作者。看PDF文件也是很累的。看完之後別忘了,給我提寶貴意見哦。謝謝。[email protected])重寫引擎強化了基於正則表達式的URLs重寫。這個功能通過RewriteEngine On定向來實現。絕大多數的重寫是單行的RewriteRule或一個RewriteCond緊跟一個RewriteRule的聯合。
RewriteRule pattern substitution [[FLAG1, FLAG2, ...]]
如果URL被pattern成功匹配,那麼把URL重寫爲substitution。substitution可以包含RewriteRule模式的回引($N),最後匹配的RewriteCond模式的回引(%N),以及規則中條件測試字符串(test-strings)中的一些變量(%{VARNAME}),和映射函數調用(${mapname:key|default})。表53中列出的可選標識,當匹配發生時引發服務器的一系列行爲。
ReeorteCond teststring pattern
爲了應用一個RewriteRule,定義一個測試條件(表54)。RewriteRule前面的多個RewriteCond之間通過隱含的AND來連接,除非被指定爲OR。 teststring可以包含RewriteRule模式的回引($N),最後匹配的RewriteCond模式的回引(%N),以及規則中條件測試字符串(test-strings)中的一些變量(%{VARNAME}),和映射函數調用(${mapname:key|default})。
表55中列出了對重寫有影響的一些變量。
Apache RewriteRule標識 |
|
模式 |
模式描述 |
C |
下一個規則的鏈(chain)。如果規則匹配,則實行重寫,以及緊接的被鏈的重寫,否則中止鏈。 |
CO=NAME:VAL:domain [:lifetime[:path]] |
設置cookie。 |
E=VAR:VAL |
設置一個環境變量 |
F |
禁止;發送403代碼 |
G |
已經轉移;發送401代碼 |
H=Content-handler |
發送內容的操作者 |
L |
最後的規則;不使用任何更多的重寫規則。 |
N |
下一個規則;在新的重寫URL中使用這個規則。 |
表54 Apache RewriteRule標識
Apache RewriteRule標識(續) |
|
模式 |
模式描述 |
NC |
沒有大小寫;使用大小寫不敏感的匹配。 |
NE |
讓URL轉義規則的應用程序不能對規則的輸出進行轉義 |
NS |
如果請求是內部的子請求,則跳過處理 |
P |
停止重寫處理,轉而處理一個內部代理請求的結果 |
PT |
轉移到下一個操作者,設置請求結構,這樣Alias,ScriptAlias和Redirect可可以作用於結果。 |
QSA |
填充查詢字符串 |
R[=Code] |
重定向到一個新的URL可選碼。默認碼爲302。 |
S=num |
跳過後續的num個規則。 |
T=MIME-type |
設置MIME類型 |
表54 Apache RewriteRule標識(續)
Apache RewriteCond標識 |
|
模式 |
模式描述 |
NC |
沒有大小寫;使用大小寫不敏感的匹配。 |
OR |
用一個局部的OR來連接規則條件,而不是隱含的AND。 |
表55 Apache RewriteCond標識
Apache Server 變量 |
|
HTTP頭部 |
連接和請求 |
HTTP_USER_AGENT |
REMOTE_ADDR |
HTTP_REFERER |
REMOTE_HOST |
HTTP_COOKIE |
REMOTE_PORT |
HTTP_FORWARDED |
REMOTE_USER |
HTTP_HOST |
REMOTE_IDENT |
HTTP_PROXY_CONNECTION |
REQUEST_METHOD |
HTTP_ACCEPT |
SCRIPT_FILENAME |
Server internals
|
PATH_INFO |
DOCUMENT_ROOT |
AUTH_TYPE |
表56 Apache Server 變量
Apache Server 變量(續) |
|
HTTP頭部 |
連接和請求 |
SERVER_ADMIN |
Date and time
|
SERVER_ADDR |
TIME_YEAR |
SERVER_PORT |
TIME_MON |
SERVER_PROTOCOL |
TIME_DAY |
Special
|
TIME-MIN |
API_VERSION |
TIME_WDAY
|
THE_REQUEST |
TIME
|
REQUEST_URI |
|
REQUEST_FILENAME |
|
IS_SUBREQ |
|
HTTPS |
|
Matching Directives
另外一些Apache命令有效的利用了正則表達式。以下是最通用的幾個命令。
AliasMatch pattern file-path|directory-path
把URLs映射到文件系統的一個位置。使用子匹配變量$1...$n來訪問文件路徑結果中的子匹配。
<DirectoryMath pattern>...</DirectiryMatch>
當文件系統目錄匹配pattern時,使用最近的一個定向。
<FilesMatch pattern>...</FilesMatch>
當文件匹配pattern時,使用最近的一個定向。
<LocationMatch pattern>...</LocationMatch>
當URL匹配pattern時,使用最近的一個定向。
<ProxyMatch pattern>...</ProxyMatch>
當URL匹配pattern時,使用最近的一個定向。
實例
實例31 簡單匹配
實例31 簡單匹配 |
# Rewrite /foo to /bar RewriteEngine On RewriteRule ^/foo$ /bar |
實例32 匹配和歸組
實例32匹配和歸組 |
# Rewrite pretty url as script parameters RewriteRule ^/(/w+)/(/d+) /index.php?action=$1&id=$2 |
實例33 重寫條件
實例33 重寫條件 |
# Limit admin url to internal IP addresses
RewriteCond %{REMOTE_ADDR} !192.168./d*./d* RewriteCond %{PATH_INFO} ^admin RewriteRule .* - [F] |
實例34 重定向
實例34重定向 |
# Make sure admin urls are served over SSL RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/admin/(.*)$ https://www.example.com/admin/$1 [L,R] |