Tips

RewriteRule選項

“redirect|R[=code]” 強制重定向。經常引用到觸發可見的定向。默認情況下它是一個HTTP 302的臨時重定向,但是你可以注明具體的HTTP 代碼,比如你可以用[R=301]來表明這是一個永久重定向,這對搜索引擎抓取你重定向后的網頁相當有用。

“proxy|P” 強制為代理
“forbidden|F” 403 禁止。告訴Apache響應請求時不提供頁面。其原理就是Apache會發出一個403 HTTP相應,可以保護網站不被未經授權的或者其他盜鏈訪問。

“nocase|NC” 忽略正則表達式中的大小寫。它經常被用到{HTTP_HOST}服務器參數上,因為域名里面是不會區分大小寫的。

“next|N” 回到第一條規則。可以讓你的重寫條件循環匹配,當你不知道{REQUEST_URI}有多少字符進行匹配的時候很有用。

“last|L” 最后一個規則。告訴Apache服務器一系列的條件或者是規則將在它出現后結束,換句話說就是[L]不出現,mod_rewrite將會一直執行。

“noescape|NE” 在輸出中不對URI作轉義。此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 一般情況下,特殊字符(如‘%’, ‘$’, ‘;’等)會被轉義為等值的十六進制編碼。 此標記可以阻止這樣的轉義,以允許百分號等符號出現在輸出中,如:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
可以使‘/foo/zed’轉向到一個安全的請求‘/bar?arg=P1=zed’.

“skip|S=N” 跳過下面的N條規則。

Mod Rewrite 推薦資源

正則表達式工具firefox擴展:Regular Expressions Tester
正則表Introduction to the Tutorial:

http://gnosis.cx/publish/programming/regular_expressions.html

Apache文檔之mod_rewrite介紹:

http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_rewrite.html

More >

URL重寫舉例

1. 給子域名加www標記

RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L]

這個規則抓取二級域名的%1變量,如果不是以www開始,那么就加www,以前的域名以及{REQUEST_URI}會跟在其后。

2. 去掉域名中的www標記

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]

More >

服務器變量

HTTP變量

  • HTTP_USER_AGENT
  • HTTP_REFERER
  • HTTP_COOKIE
  • HTTP_FORWARDED
  • HTTP_HOST
  • HTTP_PROXY_CONNECTION
  • HTTP_ACCEPT

連結和請求的變量

  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_USER
  • REMOTE_IDENT
  • REQUEST_METHOD
  • SCRIPT_FILENAME
  • PATH_INFO
  • QUERY_STRING
  • AUTH_TYPE

服務器內部變量

  • DOCUMENT_ROOT
  • SERVER_ADMIN
  • SERVER_NAME
  • SERVER_ADDR
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_SOFTWARE

系統變量

  • TIME_YEAR
  • TIME_MON
  • TIME_DAY
  • TIME_HOUR
  • TIME_MIN
  • TIME_SEC
  • TIME_WDAY
  • TIME

mod_rewrite特殊值

  • API_VERSION
  • THE_REQUEST
  • REQUEST_URI
  • REQUEST_FILENAME

RewriteCond選項

‘nocase|NC’ (no case)。它使測試忽略大小寫。此標記僅作用于TestString和CondPattern的比較, 而對文件系統和子請求的測試不起作用。
‘ornext|OR’ (or next condition)。它以OR方式組合若干規則的條件,而不是默認的AND。典型的例子如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule …some special stuff for any of these hosts…
如果不用這個標記,則必須使用三個 條件/規則。

RewriteCond指令

RewriteCond TestString CondPattern [Flags]
RewriteCond指令定義了一個規則的條件,即在一個RewriteRule指令之前有一個或多個RewriteCond指令。 條件之后的重寫規則僅在當前URI與pattern匹配并且符合這些條件的時候才會起作用。
RewriteCond也有反向引用,但和RewriteRule中用$N引用不同,它使用%N反向引用。
RewriteCond引用Apache變量%{NAME_OF_VARIABLE},如%{HTTP_HOST}。
RewriteCond的條件模式(CondPattern)除了使用perl樣式正則表達式,還有額外的規則:
1. 使用‘!’ 字符(驚嘆號)來實現匹配的反轉
2. ‘,=。
3. ‘-d’ (是一個目錄[directory])。將TestString視為一個路徑名并測試它是否存在而且是一個目錄.
4. ‘-f’ (是一個常規的文件[file])。將TestString視為一個路徑名并測試它是否存在而且是一個常規的文件.
5. ‘-s’ (是一個非空的常規文件[size])。將TestString視為一個路徑名并測試它是否存在而且是一個尺寸大于0的常規的文件.
6. ‘-l’ (是一個符號連接[link])。將TestString視為一個路徑名并測試它是否存在而且是一個符號連接.
7. ‘-F’ (對子請求有效的業已存在的文件)。測試TestString是否一個有效的文件, 而且可以被服務器當前已經配置的所有存取控制所存取。 它用一個內部子請求來做判斷,由于會降低服務器的性能,請小心使用!