虛擬主機僅提供單一根目錄,需將多個域名/子域名對應至不同子目錄,且不暴露子目錄於 URL。
# 根目錄 .htaccess
RewriteEngine On
RewriteBase /
# 1. 域名 example.com -> /bbs/ 目錄
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ bbs/$1 [L]
# 2. 根路徑導向論壇首頁
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^/?$ bbs/forum.php [L]
# 3. 子域名 api.example.com -> /api/ 目錄
RewriteCond %{HTTP_HOST} ^api\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/api/
RewriteRule ^(.*)$ api/$1 [L]
# 4. 子域名 blog.example.com -> /wp/ 目錄 (WordPress)
RewriteCond %{HTTP_HOST} ^blog\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/wp/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ wp/$1 [L]
| 指令 | 參數 | 含義 |
|---|---|---|
| RewriteEngine | On/Off | 啟用/關閉重寫引擎 |
| RewriteBase | / | 重寫基準路徑 (相對 DocumentRoot) |
| RewriteCond | %{HTTP_HOST} ^(www\.)?example\.com$ [NC] | 條件:Host 匹配 example.com 或 www.example.com,NC=不分大小寫 |
| RewriteCond | %{REQUEST_URI} !^/bbs/ | 條件:請求路徑不以 /bbs/ 開頭 (避免無限循環) |
| RewriteCond | %{REQUEST_FILENAME} !-f | 條件:請求非實體檔案 |
| RewriteCond | %{REQUEST_FILENAME} !-d | 條件:請求非實體目錄 |
| RewriteRule | ^(.*)$ bbs/$1 [L] | 規則:捕獲全部路徑重寫至 bbs/$1,L=最後一條規則 |
[L] - Last: 停止處理後續規則 [R] - Redirect: 外部重導向 (預設 302),可指定 [R=301] [NC] - No Case: 忽略大小寫 [QSA] - Query String Append: 保留原查詢字串合併新參數 [PT] - Pass Through: 傳遞給後續處理器 (如 Alias, mod_rewrite 後續規則) [F] - Forbidden: 回傳 403 [G] - Gone: 回傳 410 [E=VAR:VAL] - Environment: 設定環境變數 [CO=NAME:VAL:DOMAIN] - Cookie: 設定 Cookie [S=N] - Skip: 跳過後續 N 條規則 [T=MIME] - Type: 強制 MIME 類型
LoadModule rewrite_module modules/mod_rewrite.so)RewriteCond %{REQUEST_URI} !^/target/ 排除目標目錄!-f !-d 條件在規則前server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
location / {
# 非 bbs 開頭且非實體檔案/目錄 -> 重寫到 bbs
if ($request_uri !~ "^/bbs/") {
rewrite ^/(.*)$ /bbs/$1 last;
}
try_files $uri $uri/ /bbs/forum.php;
}
location /bbs/ {
# 實際處理邏輯
try_files $uri $uri/ /bbs/forum.php;
}
}
.htaccess URL Rewrite 是共享主機多站點部署的核心技術,掌握條件判斷與規則順序,能靈活實現各種路徑映射需求。