實現「用戶註冊即得二級域名」(如 user.example.com)需兩層配合:
在域名服務商處添加一條 A 記錄或 CNAME:
類型:A 記錄
主機記錄:*
記錄值:服務器公網 IP
TTL:600
此後所有 `*.example.com` 均解析至同一服務器 IP。
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
UseCanonicalName Off
VirtualDocumentRoot /var/www/vhosts/%1
<Directory /var/www/vhosts>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
訪問 alice.example.com 自動映射至 `/var/www/vhosts/alice` 目錄。
map $http_host $subdomain {
hostnames;
default "";
~^(?<sub>[^.]+)\.example\.com$ $sub;
}
server {
listen 80;
server_name example.com *.example.com;
root /var/www/vhosts/$subdomain;
# 若目錄不存在,返回 404 或重定向到註冊頁
if (!-d $document_root) {
return 404;
}
}
在網站根目錄 `web.config` 中:
<rule name="Subdomain Routing" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^([^.]+)\.example\.com$" />
</conditions>
<action type="Rewrite" url="{C:1}/{R:0}" />
</rule>
需配合「應用程序池啟用 32 位」及目錄權限設置。
若所有二級域名共用一套代碼(如 SaaS 系統),在入口文件解析域名:
$host = $_SERVER['HTTP_HOST'];
if (preg_match('/^([^.]+)\.example\.com$/', $host, $m)) {
$subdomain = $m[1]; // 'alice'
// 查詢數據庫驗證站點是否存在、狀態、綁定的模板等
$site = Site::findBySubdomain($subdomain);
if (!$site || $site->status !== 'active') {
header('HTTP/1.0 404 Not Found');
exit('站點不存在或已禁用');
}
// 註冊全局站點上下文
App::setCurrentSite($site);
}
允許用戶綁定自有域名(如 `blog.alice.com`):
「泛域名解析 + 服務器級路由 + 應用級識別」是成熟自主建站系統的標準架構。Apache 用 `VirtualDocumentRoot` 最簡潔,Nginx 用 `map` 靈活高效,IIS 需 URL Rewrite 模組配合。核心難點不在技術實現,而在於多租戶隔離、SSL 自動化、資源治理等運維體系建設。