15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
22.10.2024

如何为您的域名添加子域名

子域名是附加在根域名前面的前缀,在同一域名下创建一个独立的、可独立寻址的命名空间。例如,给定根域名 example.com,主机名 blog.example.com 是一个完全限定的子域名,其中 blog 是第三级标签。子域名通过 DNS 记录解析——通常是指向 IPv4 地址的 A 记录、用于 IPv6 的 AAAA 记录,或别名另一个主机名的 CNAME 记录——且无需额外的域名注册费用。

从实际角度来看,子域名允许您在单个已注册域名下运行独立的 Web 应用程序、预发布环境、区域站点或微服务,并拥有独立的文档根目录、SSL 证书和服务器配置。本指南涵盖完整的技术流程:DNS 记录创建、托管配置、SSL 部署、传播验证,以及大多数教程所忽略的常见故障模式。

什么是子域名,它与子目录有何不同

在接触 DNS 之前,有必要了解子域名与子目录之间的架构差异,因为这一选择会影响 SEO、服务器配置和 SSL 范围。

特性子域名 (`blog.example.com`)子目录 (`example.com/blog`)
是否需要 DNS 记录是(A、AAAA 或 CNAME)
独立文档根目录可选
独立 SSL 证书是(或通配符)与根域名共享
被 Google 视为独立站点通常是,取决于内容
可使用独立服务器 / VPS需要反向代理
Session / Cookie 范围默认独立共享
设置复杂度中等
适用场景应用程序、预发布环境、区域站点博客板块、产品页面

Google 的 John Mueller 已确认,当内容明显相关时,Google 通常将子域名视为同一站点的一部分,但抓取预算、索引和链接权重的行为可能有所不同。对于与主站紧密集成的内容(如公司博客),子目录通常是阻力更小的选择。对于独立应用程序——客户门户、API 网关或预发布环境——子域名才是正确的架构决策。

子域名的常见使用场景

  • 预发布和 QA 环境: staging.example.comdev.example.com ——与生产环境隔离,通常通过 HTTP Basic Auth 或 IP 白名单进行保护。
  • API 端点: api.example.com ——支持独立部署、速率限制和 TLS 终止。
  • 客户门户或 SaaS 仪表板: app.example.com ——独立的身份验证上下文和 Session Cookie。
  • 区域或语言特定站点: de.example.comus.example.com ——支持 hreflang 定向和地理特定的服务器路由。
  • 文档和支持: docs.example.comsupport.example.com ——通常托管在 GitBook、Zendesk 或自托管 Wiki 等平台上。
  • CDN 或媒体分发: cdn.example.comstatic.example.com ——CNAME 指向 CDN 边缘网络。
  • 邮件基础设施: mail.example.com ——用作 SMTP/IMAP 服务的主机名,与 MX 记录不同。

第一步:访问 DNS 管理界面

域名的 DNS 记录在域名的权威名称服务器所在位置进行管理。这与您的 Web 托管位置不一定相同。权威名称服务器由域名注册商处的 NS 记录定义。

确定您的 DNS 在哪里管理:

dig NS example.com +short

如果输出显示属于您注册商的名称服务器(例如 ns1.registrar.com),请在注册商处管理 DNS。如果显示属于托管服务商或 Cloudflare 等服务的名称服务器,请改在那里管理 DNS。

确定正确的控制面板后:

  1. 登录 DNS 管理界面。
  2. 找到 DNS Zone EditorDNS ManagementZone File 部分。
  3. 选择您要为其创建子域名的域名。

如果您的域名是通过 AlexHost 域名注册注册的,DNS 区域编辑器可直接从您的客户区仪表板访问。

第二步:为子域名创建 DNS 记录

您将根据基础设施创建以下三种记录类型之一。

A 记录——指向 IPv4 地址

当子域名解析到特定服务器 IP 地址时,使用 A 记录。这是托管在 VPS独立服务器上的子域名最常见的场景。

字段
类型A
名称 / 主机blog(而非 blog.example.com
值 / 指向203.0.113.42(您服务器的公网 IP)
TTL3600(或在初始设置期间使用 300 以加快迭代速度)

关键细节:在名称字段中只输入子域名标签——blog,而非 blog.example.com。大多数 DNS 界面会自动附加根域名。输入完整的 FQDN 将会为 blog.example.com.example.com 创建记录。

AAAA 记录——指向 IPv6 地址

结构与 A 记录相同,但值为完整的 IPv6 地址:

字段
类型AAAA
名称 / 主机blog
2001:db8::1
TTL3600

CNAME 记录——别名另一个主机名

当子域名应解析到另一个主机名而非直接 IP 时,使用 CNAME 记录。常见场景包括指向 CDN、第三方平台(Shopify、HubSpot、Netlify)或另一个内部主机名。

字段
类型CNAME
名称 / 主机shop
值 / 目标shops.myplatform.com.(注意末尾的点——表示 FQDN)
TTL3600

架构限制: CNAME 记录不能与同一标签下的任何其他记录类型共存。您不能为 example.com 本身(区域顶点)创建 CNAME——只能为子域名创建。在顶点处,使用 A 记录,或者如果您的 DNS 提供商支持,使用专有的 ALIASANAME 记录。

通配符子域名记录

通配符 A 记录将任何未定义的子域名解析到单个 IP:

字段
类型A
名称 / 主机*
203.0.113.42
TTL3600

这对于每个客户都有子域名的多租户 SaaS 应用程序非常有用(例如 customer1.example.com)。请注意,通配符记录不会自动为每个子域名部署 SSL——您需要通配符 SSL 证书或支持 DNS-01 质询的 ACME 客户端。

第三步:配置 Web 服务器或托管面板

创建 DNS 记录使子域名可解析,但不会自动提供内容服务。您必须配置 Web 服务器或托管面板以接受并路由新主机名的请求。

在 cPanel 中配置子域名

如果您的托管使用 cPanel——可在带 cPanel 的 VPS 方案中使用——操作步骤如下:

  1. 登录 cPanel。
  2. 导航至域名 > 子域名
  3. 子域名字段中,输入标签(例如 blog)。
  4. 从下拉菜单中选择根域名。
  5. 设置文档根目录——cPanel 默认为 public_html/blog,但您可以指定任意路径。
  6. 点击创建

如果域名的 DNS 在本地管理,cPanel 会自动在 WHM 的 BIND 区域中创建 DNS A 记录。如果 DNS 由外部管理(例如 Cloudflare),您必须按照第二步所述在那里手动添加记录。

在 Nginx 中配置子域名

对于运行 Nginx 的 VPS,创建一个新的 server block:

server {
    listen 80;
    listen [::]:80;
    server_name blog.example.com;

    root /var/www/blog;
    index index.html index.php;

    access_log /var/log/nginx/blog.access.log;
    error_log  /var/log/nginx/blog.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

将文件保存到 /etc/nginx/sites-available/blog.example.com,然后启用它:

sudo ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

在 Apache 中配置子域名

/etc/apache2/sites-available/blog.example.com.conf 创建一个新的虚拟主机文件:

<VirtualHost *:80>
    ServerName blog.example.com
    DocumentRoot /var/www/blog

    <Directory /var/www/blog>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog  ${APACHE_LOG_DIR}/blog.error.log
    CustomLog ${APACHE_LOG_DIR}/blog.access.log combined
</VirtualHost>

启用并重新加载:

sudo a2ensite blog.example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

第四步:为子域名部署 SSL 证书

每个提供 Web 流量的子域名都应使用 TLS 进行保护。子域名是一个独立的主机名,除非您使用通配符证书,否则受根域名单域证书的保护。

选项 1——使用 Certbot 的 Let’s Encrypt(单个子域名)

sudo certbot --nginx -d blog.example.com

或用于 Apache:

sudo certbot --apache -d blog.example.com

Certbot 会自动修改虚拟主机配置并设置续期的 cron 任务。

选项 2——Let’s Encrypt 通配符证书(DNS-01 质询)

通配符证书覆盖 *.example.com,用单个证书保护所有当前和未来的子域名。这需要 DNS-01 质询验证:

sudo certbot certonly 
  --manual 
  --preferred-challenges dns 
  -d "*.example.com" 
  -d "example.com"

Certbot 将提示您在 DNS 区域中创建 TXT 记录(_acme-challenge.example.com)。添加记录并验证传播后,Certbot 将颁发证书。通配符证书必须每 90 天续期一次;使用您提供商的 DNS 插件自动续期(例如 certbot-dns-cloudflare)。

选项 3——商业 SSL 证书

对于需要扩展验证(EV)或更长有效期的组织,来自受信任 CA 的商业证书是合适的选择。AlexHost 提供 SSL 证书,包括域名验证、组织验证和通配符选项。购买后,通过将 .crt.key 文件放置在服务器上并在虚拟主机配置中引用它们来安装证书。

第五步:验证 DNS 传播

DNS 更改不会在您保存后立即在全球生效。每个解析器会在 TTL 值的持续时间内缓存记录。TTL 为 3600 时,解析器可能在您更改后最多一小时内仍提供旧记录。

从多个全球视角检查传播情况:

# Check from a specific DNS resolver
dig A blog.example.com @8.8.8.8 +short
dig A blog.example.com @1.1.1.1 +short

# Check authoritative answer directly
dig A blog.example.com +trace

如需可视化的多区域检查,请使用 whatsmydns.net 或 dnschecker.org。对于 TTL 为 3600 或更低的情况,完整的全球传播通常在 15 分钟到 2 小时内完成。常被引用的”最多 48 小时”主要适用于之前记录上设置的 TTL 值为 86400(24 小时)的情况——这是许多注册商的常见默认值。

专业提示:在进行 DNS 更改之前,至少提前一个 TTL 周期将现有记录的 TTL 降低至 300(5 分钟)。这将在实际更改期间大幅减少传播等待时间。

第六步:测试端到端功能

传播完成后,执行完整的功能测试:

# Confirm DNS resolution
dig A blog.example.com +short

# Confirm HTTP response
curl -I http://blog.example.com

# Confirm HTTPS and certificate validity
curl -I https://blog.example.com

# Inspect the TLS certificate
openssl s_client -connect blog.example.com:443 -servername blog.example.com </dev/null 2>/dev/null 
  | openssl x509 -noout -subject -dates

验证以下内容:

  • curl -I 响应返回 200 OK 或预期的重定向代码。
  • TLS 证书主题与 blog.example.com*.example.com 匹配。
  • 证书到期日期正确。
  • 浏览器开发者控制台中没有混合内容警告。

常见陷阱及如何避免

区域顶点处的 CNAME:尝试为 example.com 本身创建 CNAME 记录将破坏邮件传递和其他 DNS 记录。在顶点处使用 A 记录或 ALIAS/ANAME 记录。

Web 服务器未提供子域名服务:DNS 解析正确,但浏览器返回 404 或连接被拒绝。原因:Web 服务器没有与子域名主机名匹配的虚拟主机。解决方案:按照第三步所述添加 server block 或虚拟主机。

SSL 证书不匹配:浏览器显示证书错误。原因:现有证书仅覆盖 example.com,而非 blog.example.com。解决方案:专门为子域名颁发新证书,或替换为通配符证书。

cPanel 创建本地 DNS 记录但 DNS 由外部管理:当使用 Cloudflare 或其他外部 DNS 提供商与 cPanel 托管时,cPanel 的子域名向导会在 WHM 的本地 BIND 区域中创建记录,而该区域从不会被查询。您必须在 Cloudflare(或您的外部 DNS 提供商)中手动添加 A 记录。这是共享托管用户最常见的困惑来源之一。

通配符 DNS 没有通配符 SSL: *.example.com DNS 记录将所有子域名解析到您的服务器,但除非安装了通配符 SSL 证书,否则每个新子域名都会触发证书警告。不要仅依赖通配符 DNS 用于生产子域名。

Cookie 范围泄漏:如果您的应用程序在 .example.com(注意前导点)上设置 Cookie,这些 Cookie 将被发送到所有子域名。这可能会将高安全性子域名的 Session Token 暴露给安全性较低的子域名。请将 Cookie 明确限定在目标主机名范围内。

不同托管环境中的子域名管理

托管类型DNS 管理Web 服务器配置SSL 部署
共享托管注册商或 cPanel DNS 区域cPanel 子域名向导cPanel 中的 AutoSSL / Let’s Encrypt
VPS(非托管)注册商或外部 DNS手动配置 Nginx / Apache vhostCertbot CLI
带 cPanel 的 VPSWHM / cPanel DNS 或外部cPanel 子域名向导AutoSSL
独立服务器注册商或 BIND/PowerDNS手动或控制面板Certbot 或商业 CA
云(AWS、GCP)Route 53 / Cloud DNS负载均衡器 / Ingress 规则ACM / Let’s Encrypt

对于需要完整 root 访问权限和自定义服务器配置的高流量应用程序,独立服务器可让您完全控制 DNS、Web 服务器软件和证书管理,不受共享环境的限制。

技术决策检查清单

在创建子域名之前,请完成以下检查:

  • 权威名称服务器在哪里?在登录任何面板之前,运行 dig NS example.com +short 进行确认。
  • A 记录还是 CNAME?对于服务器 IP 使用 A/AAAA。对于第三方平台主机名使用 CNAME。永远不要在区域顶点使用 CNAME
  • Web 服务器是否配置为接受新主机名?仅有 DNS 记录不能提供内容服务。
  • 子域名是否需要自己的 SSL 证书?是的,除非已安装通配符证书。
  • 更改前 TTL 是否已设置为较低值?在进行更改前至少一个 TTL 周期将其降低至 300,以最小化传播延迟。
  • cPanel 是否在本地管理 DNS,而外部提供商是权威的?如果是,请在外部提供商处添加记录,而非 cPanel。
  • 子域名是否需要阻止搜索引擎索引?如果是预发布或内部环境,请在服务器级别添加 X-Robots-Tag: noindex 或使用 HTTP Basic Auth。
  • Cookie 范围是否正确定义?在 Cookie 上明确设置 Domain 属性,以防止意外的跨子域名共享。

常见问题

我可以在没有根域名 DNS 访问权限的情况下创建子域名吗?

不可以。子域名需要在根域名区域中有 DNS 记录(AAAAACNAME)。如果没有对权威 DNS 区域的写入权限,您无法创建可公开解析的子域名。

子域名会影响根域名的 SEO 吗?

这取决于内容关系和内部链接。Google 可以将子域名与根域名关联,但链接权重的流动不如子目录 URL 之间那么自由。对于与主站紧密集成的内容,从 SEO 角度来看,子目录通常更为可取。对于独立应用程序或预发布环境,子域名是正确的选择,如果不打算用于公开搜索,应将其 noindex

一个域名下可以创建多少个子域名?

DNS 规范对子域名数量没有实际限制。注册商和托管面板可能会施加软限制,但这些是管理性的,而非技术性的。单个域名可以拥有数百个子域名。

通配符 DNS 记录和通配符 SSL 证书有什么区别?

通配符 DNS 记录(*.example.com)在 DNS 层将所有未定义的子域名路由到单个 IP 地址。通配符 SSL 证书(*.example.com)在 TLS 层保护所有一级子域名。它们是独立的:您可以只有其中一个,但要在不单独部署证书的情况下通过 HTTPS 为所有子域名提供服务,两者都是必需的。

为什么我的子域名在 dig 中解析正确,但浏览器返回错误?

DNS 解析和 HTTP 服务是独立的层。如果 dig 返回正确的 IP,但浏览器显示错误,则该 IP 上的 Web 服务器未配置为处理该主机名的请求(Nginx 中的 server_name 或 Apache 中的 ServerName)。添加适当的虚拟主机块并重新加载 Web 服务器。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用