RewriteCond 定義 RewriteRule 生效的前置條件,支援多條件 AND/OR 邏輯,是動態重寫的核心控制器。
語法結構
RewriteCond TestString CondPattern [flags]
- TestString:測試字串,可包含伺服器變數、反向引用、映射查找
- CondPattern:條件模式(Perl 相容正則 + 特殊前綴)
- flags:
NC(忽略大小寫)、OR(邏輯或)
TestString 可用變數分類
| 類別 | 代表變數 |
| HTTP 請求頭 | %{HTTP_HOST}, %{HTTP_USER_AGENT}, %{HTTP_REFERER}, %{HTTP_COOKIE} |
| 連線與請求 | %{REMOTE_ADDR}, %{REQUEST_METHOD}, %{QUERY_STRING}, %{REQUEST_URI}, %{REQUEST_FILENAME} |
| 伺服器內建 | %{SERVER_NAME}, %{SERVER_PORT}, %{SERVER_PROTOCOL}, %{DOCUMENT_ROOT}, %{HTTPS} |
| 時間日期 | %{TIME_YEAR}, %{TIME_MON}, %{TIME_DAY}, %{TIME_HOUR}, %{TIME_MIN}, %{TIME_SEC}, %{TIME_WDAY}, %{TIME} |
| 特殊 | %{THE_REQUEST}, %{API_VERSION}, %{IS_SUBREQ} |
CondPattern 特殊前綴(非正則)
| 前綴 | 含義 | 範例 |
! | 否定匹配 | !^admin |
< | 字典序小於 | <test |
> | 字典序大於 | >test |
= | 字典序等於(可比空串) | ="" |
-d | 存在且為目錄 | -d |
-f | 存在且為一般檔案 | -f |
-s | 存在且大小 > 0 | -s |
-l | 存在且為符號連結 | -l |
-x | 存在且可執行 | -x |
-F | 子請求檢查檔案可訪問(慎用,影響效能) | -F |
-U | 子請求檢查 URL 可訪問(慎用) | -U |
Flags 詳解
NC / nocase:測試字串與模式比較時忽略大小寫
OR / ornext:將下一條 RewriteCond 以 OR 邏輯連接(預設 AND)
實戰範例
1. 多域名導向同一規則集
RewriteCond %{HTTP_HOST} ^site1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.site1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^site2\.com$
RewriteRule ^(.*)$ /sites/%{HTTP_HOST}/$1 [L]
2. 防盜鏈:僅允許特定 Referer
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?mysite\.com/.*$ [NC]
RewriteRule \.(jpg|png|gif)$ - [F]
3. 移動端子域名導向
RewriteCond %{HTTP_USER_AGENT} "android|iphone|ipad" [NC]
RewriteCond %{HTTP_HOST} !^m\.
RewriteRule ^(.*)$ https://m.mysite.com/$1 [R=302,L]
4. 靜態檔案存在則直接服務,否則轉發動態處理
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
調試技巧
# 啟用重寫日誌(Apache 2.4+)
LogLevel alert rewrite:trace3
# 錯誤日誌將顯示詳細匹配過程