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

自主建站系統實現泛域名與二級域名自動分配

     編輯:PHP 相關知識

核心架構:泛域名解析 + Web 服務器路由

實現「用戶註冊即得二級域名」(如 user.example.com)需兩層配合:

1. DNS 層:泛域名解析

在域名服務商處添加一條 A 記錄或 CNAME:

類型:A 記錄
主機記錄:*
記錄值:服務器公網 IP
TTL:600

此後所有 `*.example.com` 均解析至同一服務器 IP。

2. Web 服務器層:識別 Host header 並路由

Apache 配置(VirtualDocumentRoot)

<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` 目錄。

Nginx 配置(map + 變量)

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

IIS 配置(URL Rewrite)

在網站根目錄 `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`):

  1. 用戶在域名商添加 CNAME 指向 `example.com`;
  2. 後台驗證域名所有權(TXT 記錄或文件驗證);
  3. 數據庫記錄 `custom_domain → site_id` 映射;
  4. 入口文件優先匹配自定義域名,再 fallback 到二級域名邏輯。

安全與性能提示

  • 防止子域名枚舉:不在前端暴露站點列表,API 限制速率。
  • SSL 證書:使用 Let's Encrypt 通配符證書(`*.example.com`)或單域名證書自動續簽(acme.sh + DNS API)。
  • 緩存隔離:Redis Key、Opcode 緩存、CDN 緩存鍵均需包含站點 ID。
  • 資源限額:磁盤配額、CPU/內存限制(cgroups / CloudLinux LVE)、並發連接數。

總結

「泛域名解析 + 服務器級路由 + 應用級識別」是成熟自主建站系統的標準架構。Apache 用 `VirtualDocumentRoot` 最簡潔,Nginx 用 `map` 靈活高效,IIS 需 URL Rewrite 模組配合。核心難點不在技術實現,而在於多租戶隔離、SSL 自動化、資源治理等運維體系建設。

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