在 Web 伺服器管理中,經常需要實現泛子域名自動對應到不同的網站目錄。例如 user1.example.com 訪問 /home/user/www/user1/,user2.example.com 訪問 /home/user/www/user2/。Nginx 通過正則捕獲子域名並動態設置 root 路徑,即可輕鬆實現此需求。
server {
listen 80;
server_name domain.com www.domain.com *.domain.com;
set $subdomain '';
if ($host ~* (\b(?!www\b).+)\.domain\.com) {
set $subdomain -$1;
}
root /home/user/www$subdomain/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 處理配置(視具體環境調整)
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
*.domain.com 使 Nginx 接受任意子域名請求。同時保留 domain.com 和 www.domain.com 確保主域名正常訪問。
if ($host ~* (\b(?!www\b).+)\.domain\.com) 使用負向前瞻 (?!www\b) 排除 www 開頭的訪問,捕獲真實子域名部分(如 blog、shop 等)。
通過 set $subdomain -$1 將捕獲的子域名賦值給變量,最終在 root 指令中拼接路徑。若為主域名訪問,$subdomain 為空,根目錄即為 /home/user/www/。
mkdir -p 確保目標目錄存在*.domain.com)實現全站 HTTPSaccess_log 和 error_log 按子域名分離存儲| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 子域名返回 404 | 目標目錄不存在或權限不足 | 檢查目錄路徑、執行 chmod 755 和 chown www:www |
| 主域名也進入子目錄 | 正則未正確排除 www 和裸域名 | 優化正則,確保 www 和 @ 不被捕獲 |
| 配置重載失敗 | 語法錯誤或指令衝突 | 執行 nginx -t 檢查語法,查看錯誤日誌 |
Nginx 泛子域名配置的核心在於 server_name 泛匹配、正則提取子域名、動態構建 root 路徑三步走。掌握此技巧,可輕鬆支撐 SaaS 多租戶、用戶個人主頁、多站點集群等場景,大幅降低運維成本。