生活就像一個圈,來來回回…
Tips
RewriteRule選項
四月 22nd
“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 推薦資源
四月 18th
正則表達式工具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
URL重寫舉例
四月 14th
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]
服務器變量
四月 10th
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選項
四月 7th
‘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指令
四月 4th
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是否一個有效的文件, 而且可以被服務器當前已經配置的所有存取控制所存取。 它用一個內部子請求來做判斷,由于會降低服務器的性能,請小心使用!