`RewriteCond` 類似編程中的 `if` 語句:當條件滿足時,執行緊隨其後的 `RewriteRule`。多條 `RewriteCond` 默認邏輯與(AND),需顯式加 `[OR]` 標誌實現或(OR)邏輯。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0.*
RewriteRule index\.php index.m.php
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule index\.php index.L.php
RewriteRule index\.php index.b.php
等同於 PHP 邏輯:
if ($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0') {
// 訪問 index.m.php
} elseif ($_SERVER['HTTP_USER_AGENT'] == 'Lynx') {
// 訪問 index.L.php
} else {
// 訪問 index.b.php
}
RewriteCond %{HTTP_REFERER} (www\.test\.cn)
RewriteRule (.*)$ test.php
若上一頁主機為 www.test.cn,所有請求跳轉至 test.php。
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php
滿足任一主機條件即跳轉。
# 文件存在直接訪問,不重寫
RewriteCond %{REQUEST_FILENAME} !-f
# 目錄存在直接訪問,不重寫
RewriteCond %{REQUEST_FILENAME} !-d
# 靜態資源直接訪問,不重寫
RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg)$
這三條常組合用於前端控制器模式(如框架入口 index.php),確保靜態資源不經框架處理,提升性能。
| 變量 | 含義 |
|---|---|
| %{HTTP_USER_AGENT} | 客戶端瀏覽器標識 |
| %{HTTP_REFERER} | 來源頁面 URL |
| %{REMOTE_HOST} | 客戶端主機名 |
| %{REQUEST_FILENAME} | 請求映射的本地文件路徑 |
| %{REQUEST_URI} | 請求的 URI 路徑 |
掌握 `RewriteCond` 的條件判斷、正則匹配、標誌位(`[OR]`, `[NC]` 等)及常用服務器變量,能靈活實現訪問控制、URL 美化、多站點路由等需求。建議結合 `RewriteLog` 調試複雜規則。