首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

.htaccess 綁定域名到子目錄:URL Rewrite 實現多站點共享主機

     編輯:PHP 相關知識

應用場景

虛擬主機僅提供單一根目錄,需將多個域名/子域名對應至不同子目錄,且不暴露子目錄於 URL。

.htaccess 規則

# 根目錄 .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]

指令詳細解析

指令參數含義
RewriteEngineOn/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=最後一條規則

進階 Flags 速查

[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 類型

常見問題與除錯

  1. 500 Internal Server Error:語法錯誤、模組未載入 (確認 LoadModule rewrite_module modules/mod_rewrite.so)
  2. 無限重導向:缺少 RewriteCond %{REQUEST_URI} !^/target/ 排除目標目錄
  3. 靜態資源 404:確認 !-f !-d 條件在規則前
  4. 子目錄 .htaccess 衝突:子目錄規則優先,根目錄規則可能不生效,需協調

Nginx 等效配置

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;
    }
}

部署檢查清單

  • [ ] 主機支援 mod_rewrite / Nginx rewrite
  • [ ] .htaccess 權限 644,所屬正確用戶
  • [ ] AllowOverride All 於對應 Directory 區塊
  • [ ] 測試各域名根路徑、靜態資源、深層路徑正常訪問
  • [ ] 確認子目錄應用 (如 WordPress/Discuz) 內部連結生成正確 (設定 Site URL)

.htaccess URL Rewrite 是共享主機多站點部署的核心技術,掌握條件判斷與規則順序,能靈活實現各種路徑映射需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved