RewriteCond %{HTTP_HOST} !^$ #求的主機中URL不為空
RewriteRule ^/(.*) http://www.web.com/ [L]
#含義是如果Client請求的主機中的URL符合上述條件,則直接進行跳轉到http://www.web.com/,[L]意味著立即停止重寫操作,並不再應用其他重寫規則。這裡的.*是指匹配所有URL中不包含換行字符,()括號的功能是把所有的字符做一個標記,以便於後面的應用.就是引用前面裡的(.*)字符。
1) R[=code](force redirect) 強制外部重定向[r=301]
2) F(force URL to be forbidden)禁用URL,返回403HTTP狀態碼。
3) G(force URL to be gone) 強制URL為GONE,返回410HTTP狀態碼。
4) P(force proxy) 強制使用代理轉發。
5) L(last rule) 表明當前規則是最後一條規則,停止分析以後規則的重寫。
6) N(next round) 重新從第一條規則開始運行重寫過程。
7) C(chained with next rule) 與下一條規則關聯
8) T=MIME-type(force MIME type) 強制MIME類型
9) NS (used only if no internal sub-request) 只用於不是內部子請求
10) NC(no case) 不區分大小寫
11) QSA(query string append) 追加請求字符串
12) NE(no URI escaping of output) 不在輸出轉義特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 將能正確的將/foo/zoo轉換成/bar?arg=P1=zoo
13) PT(pass through to next handler) 傳遞給下一個處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會交給/def規則處理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳過num條規則
15) E=VAR:VAL(set environment variable) 設置環境變量
. 換行符以外的所有字符
\w匹配字母或數字或下劃線或漢字
\s匹配任意的空白符
\d匹配數字
\b匹配單詞的開始或結束
^匹配字符串的開始
$匹配字符串的結束
*重複零次或更多次
*重複零次或更多次
+重複一次或更多次
?重複零次或一次
{n}重複n次
{n,}重複n次或更多次
{n,m}重複n到m次
應用替換時,前面第一個()中匹配的內容後面就用$1引用,第二個()中匹配的就用$2應用……
推荐一個實用的正則在線測試網站http://www.regextester.com/
我們來分析一下discuz7.0 搜索引擎優化htaccess 裡面的重寫。
RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2
首先加入用戶通過nbphp.com/forum-2-3.html 訪問discuz論壇,那麼先通過.htaccess過濾,看看是否需要.htaccess引導一下用戶,如果滿足列出的一系列RewriteCond的條件那麼就進行重寫,discuz的沒有列出RewriteCond 所以應該全部都進行重寫。所以開始進行轉寫,forum-2-3.html 這個正好符合列出的^forum-([0-9]+)-([0-9]+)\.html$ 正則表達式。並且$1 為2 ,$2為3 ,所以代入後面,即forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件目錄,那麼就帶他到製定目錄的forumdisplay.php?fid=2&page=3 。