.htaccess
配置文件能夠經過RewriteCond
和 RewriteRule
實現僞靜態。php
// 含義:當什麼東西 匹配 某種模式,則.. RewriteCond TestString CondPattern [Flags] RewriteCond %{HTTP_HOST} abc.com
TestString
是指一個文本格式的條件,如:環境變量名HTTP_HOST所包含的內容(Name= Value),這是一個map(鍵值對)格式的數據類型。CondPattern
是條件參數,是正則表達式或字符串直接量,如上例就是abc.com。Flags
標識,能夠用來緊跟下一個條件,用OR表示或者,若是沒有[Flags],則用隱含爲AND,表示而且。其它的還能夠NC等等,表示忽略大小寫RewriteCond就像咱們程序中的if語句同樣,表示若是符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能,例如:html
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.* # RewriteRule 當條件知足時,把url怎麼改寫 緊跟在RewriteCond後面 RewriteRule index.php index.m.php RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule index.php index.L.php # 上面的條件都不知足時,執行下列這個改寫規則 RewriteRule index.php index.b.php
上面語句的做用是當你是用FF瀏覽器訪問index.php這個文件的時候,會自動讓你訪問到index.m.php這個文件,當你是用一些移動終端訪問的 時候,會讓你對index.php這個文件的訪問實際訪問的是index.L.php去,若是你是用其它的瀏覽器訪問的時候,會讓你跳到 index.b.php。正則表達式
# RewriteRule含義:把什麼模式的url進行改寫 RewriteRule Pattern Substitution [Flags]
Pattern
是正則或字符串字面量,表示URL模式,通常爲一些文件的擴展名,Substitution
是用來替換URL中匹配pattern的部分Flags
R表示redirect(強制重定向),F表示forbidden(禁止訪問),L表示last(最後),一般當你但願中止重寫操做而當即重定向時,可用L元字符^
匹配你要用來查找的字符串的開頭元字符$
匹配結尾。好比一個網站若是要求你填寫的QQ號必須爲5位到12位數字時,可使用:^\d{5,12}$。apache
apache 模塊mod_rewrite
提供了一個基於正則表達式分析器的重寫引擎來實時重寫URL請求。 它支持每一個完整規則能夠擁有不限數量的子規則以及附加條件規則的靈活並且強大的URL操做機制。 此URL操做能夠依賴於各類變量,好比服務器變量、環境變量、HTTP頭、時間標記瀏覽器
此模塊能夠操做URL的全部部分(包括路徑信息部分),在__服務器級的(httpd.conf)__和__目錄級的(. htaccess )__配置都有效,還能夠生成最終請求字符串。 此重寫操做的結果能夠是內部子處理,也能夠是外部請求的轉向,甚至還能夠是內部代理處理。安全
這裏着重介紹一下RewriteCond 的規則以及參數說明。RewriteCond指令定義了規則生效的條件,即在一個RewriteRule指令以前能夠有一個或多個RewriteCond指令。 條件以後的重寫規則僅在當前URI與Pattern匹配而且知足此處的條件(TestString可以與CondPattern匹配)時纔會起做用。服務器
【說明】定義重寫發生的條件
【語法】RewriteCond TestString CondPattern [flags]
【做用域】server config, virtual host, directory, .htaccess
【覆蓋項】FileInfo
【狀態】 擴展(E)
【模塊】mod_rewrite性能
TestString是一個純文本的字符串,可是還能夠包含下列可擴展的成分:
RewriteRule反向引用 ,引用方法是:$N (0 <= N <= 9)引用當前(帶有若干RewriteRule指令的)RewriteCond中的與Pattern匹配的捕獲分組(圓括號!)。
RewriteCond反向引用 ,引用方法是:%N (1 <= N <= 9)引用當前若干RewriteCond條件中最後符合的條件中的捕獲分組(圓括號!)。
RewriteMap擴展 ,引用方法是:${mapname:key|default} 細節請參見RewriteMap指令 。測試
服務器變量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE能夠是下表列出的字符串之一:網站
這些變量都對應於相似命名的HTTP MIME頭、Apache服務器的C變量、Unix系統中的struct tm字段,其中的大多數在其餘的手冊或者CGI規範中都有說明。 其中爲mod_rewrite所特有的變量以下:
其它注意事項:
SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的——即Apache服務器內部的request_rec結構中的filename字段。
特殊形式:%{ENV:variable} ,其中的variable能夠是任意環境變量。 它是經過查找Apache內部結構或者(若是沒找到的話)由Apache服務器進程經過getenv()獲得的。
特殊形式:%{SSL:variable} ,其中的variable能夠是一個SSL環境變量 的名字,不管mod_ssl 模塊是否已經加載均可以使用(未加載時爲空字符串)。 好比:%{SSL:SSL_CIPHER_USEKEYSIZE}將會被替換爲128。
特殊形式:%{HTTP:header} ,其中的header能夠是任意HTTP MIME頭的名稱。 它老是能夠經過查找HTTP請求而獲得。 好比:%{HTTP:Proxy-Connection}將被替換爲Proxy-Connection:HTTP頭的值。
預設形式:%{LA-U:variable} ,variable的最終值在執行一個內部(基於URL的)子請求後肯定。 當須要使用一個目前未知可是會在以後的過程當中設置的變量的時候,就可使用這個方法。 例如,須要在服務器級配置(httpd.conf文件)中根據REMOTE_USER變量進行重寫, 就必須使用%{LA-U:REMOTE_USER}。 由於此變量是由URL重寫(mod_rewrite)步驟以後的認證步驟設置的。 可是另外一方面,由於mod_rewrite是經過API修正步驟來實現目錄級(.htaccess文件)配置的, 而認證步驟先於API修正步驟,因此能夠用%{REMOTE_USER}。
預設形式:%{LA-F:variable} ,variable的最終值在執行一個內部(基於文件名的)子請求後肯定。 大多數狀況下和上述的LA-U是相同的。
CondPattern是條件模式,即一個應用於當前TestString實例的正則表達式。TestString將被首先計算,而後再與CondPattern匹配。
注意:CondPattern是一個perl兼容的正則表達式,可是還有若干增補:
CondPatterns有若干特殊的變種。 除了正則表達式的標準用法,還有下列用法:
‘<CondPattern ‘ (詞典順序的小於)
將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString小於CondPattern則爲真。
‘>CondPattern ‘ (詞典順序的大於)
將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString大於CondPattern則爲真。
‘=CondPattern ‘ (詞典順序的等於)
將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString等於CondPattern(兩個字符串逐個字符地徹底相等)則爲真。 若是CondPattern是」"(兩個雙引號),則TestString將與空字符串進行比較。
‘-d ‘(目錄)
將TestString視爲一個路徑名並測試它是否爲一個存在的目錄。
‘-f ‘(常規文件)
將TestString視爲一個路徑名並測試它是否爲一個存在的常規文件。
‘-s ‘(非空的常規文件)
將TestString視爲一個路徑名並測試它是否爲一個存在的、尺寸大於0的常規文件。
‘-l ‘(符號鏈接)
將TestString視爲一個路徑名並測試它是否爲一個存在的符號鏈接。
‘-x ‘(可執行)
將TestString視爲一個路徑名並測試它是否爲一個存在的、具備可執行權限的文件。 該權限由操做系統檢測。
‘-F ‘(對子請求存在的文件)
檢查TestString是否爲一個有效的文件,並且能夠在服務器當前的訪問控制配置下被訪問。 它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!
‘-U ‘(對子請求存在的URL)
檢查TestString是否爲一個有效的URL,並且能夠在服務器當前的訪問控制配置下被訪問。 它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!
注意: 全部這些測試均可以用驚歎號做前綴(‘!’)以實現測試條件的反轉。
在CondPattern以後追加特殊的標記[flags] 做爲RewriteCond指令的第三個參數。flags是一個以逗號分隔的如下標記的列表:
‘nocase|NC ‘(忽略大小寫)
它使測試忽略大小寫,擴展後的TestString和CondPattern中’AZ’ 和’a-z’是沒有區別的。 此標記僅用於TestString和CondPattern的比較,而對文件系統和子請求的檢查不起做用。
‘ornext|OR ‘(或下一條件)
它以OR方式組合若干規則的條件,而不是隱含的AND。 典型的例子以下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule … # 針對這3個主機的規則集…若是不用[OR]這個標記,你就必需要書寫三次條件/規則對。
舉例 : 若是要按請求頭中的」User-Agent:」重寫一個站點的主頁,能夠這樣寫:
RewriteCond % { HTTP_USER_AGENT } ^Mozilla.* RewriteRule ^/$ /homepage. max .html [ L ] RewriteCond % { HTTP_USER_AGENT } ^Lynx.* RewriteRule ^/$ /homepage. min .html [ L ] RewriteRule ^/$ /homepage .std.html [ L ]
解釋: 若是你使用的瀏覽器的userAgent是’Mozilla’,則你將獲得內容最大化的主頁(含有Frames等等)。 若是你使用的是(基於終端的)Lynx, 則你獲得的是內容最小化的主頁(不含table等等)。 若是上述條件都不知足(使用的是其餘瀏覽器),則你獲得的是一個標準的主頁。