通配符 DNS 配置
通配符 DNS 允许使用 acme.yourdomain.com、techcorp.yourdomain.com 等租户子域名。这是可选功能 — FeedbackPulse 不需要通配符 DNS 也可正常使用基于 slug 的 URL(如 /wall/acme-corp)。
我是否需要通配符 DNS?
| 场景 | 是否需要通配符 DNS? |
|---|---|
租户使用基于 slug 的公开页面(/wall/acme-corp) | 否 |
租户需要自己的子域名(acme.yourdomain.com) | 是 |
租户使用自有自定义域名(feedback.acme.com) | 否(使用 CNAME 代替) |
所需条件
- 通配符 DNS A 记录:
*.yourdomain.com→ 您的服务器 IP - 通配符 SSL 证书: 覆盖
*.yourdomain.com - Web 服务器配置: 接受所有子域名请求
第一步:添加 DNS 记录
进入您的域名注册商 DNS 管理面板并添加:
| 类型 | 名称/主机 | 值 | TTL |
|---|---|---|---|
| A | * | 123.456.789.0(您的服务器 IP) | 300 |
根域名同样需要普通 A 记录:
类型 名称/主机 值 A @123.456.789.0
各服务商操作说明
Cloudflare
- 登录 Cloudflare 控制台
- 选择您的域名
- 进入 DNS → 记录
- 点击 添加记录
- 类型:
A| 名称:*| IPv4:您的服务器 IP | 代理:仅 DNS(灰色云朵) - 点击 保存
重要: 通配符子域名请将 Cloudflare 代理设置为仅 DNS(灰色云朵),而非已代理(橙色云朵)。Cloudflare 免费计划不支持代理通配符子域名。
Namecheap
- 登录 → 域名列表 → 管理您的域名
- 进入 高级 DNS
- 点击 添加新记录
- 类型:
A Record| 主机:*| 值:您的服务器 IP | TTL:自动 - 保存
GoDaddy
- 登录 → 我的产品 → 您域名的 DNS
- 点击 添加记录
- 类型:
A| 名称:*| 值:您的服务器 IP | TTL:600 - 保存
Google Domains / Google Cloud DNS
- 进入 Google Domains
- 选择您的域名 → DNS
- 在 自定义记录 下添加:
- 主机:
*| 类型:A| 数据:您的服务器 IP - 保存
AWS Route 53
- 进入 Route 53 → 托管区域 → 选择您的域名
- 点击 创建记录
- 记录名称:
*| 记录类型:A - 值:您的服务器 IP | TTL:
300 - 点击 创建记录
DigitalOcean DNS
- 进入 网络 → 域名
- 选择您的域名
- 添加:类型
A| 主机名*| 指向:您的服务器 IP | TTL:300
Hetzner DNS
- 进入 Hetzner DNS 控制台
- 选择您的区域
- 添加记录:类型
A| 名称*| 值:您的服务器 IP
第二步:获取通配符 SSL 证书
方案 A:Let's Encrypt DNS 验证(免费)
Let's Encrypt 的通配符证书需要使用 DNS-01 验证(非 HTTP):
# 安装适合您服务商的 Certbot DNS 插件
# 示例:Cloudflare
sudo apt install certbot python3-certbot-dns-cloudflare
# 创建 Cloudflare 凭据文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/cloudflare.ini
添加您的 Cloudflare API token:
dns_cloudflare_api_token = your_cloudflare_api_token_here
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# 获取通配符证书
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d yourdomain.com \
-d "*.yourdomain.com"
其他服务商的 DNS 插件
| 服务商 | Certbot 插件 | 安装命令 |
|---|---|---|
| Cloudflare | python3-certbot-dns-cloudflare | sudo apt install python3-certbot-dns-cloudflare |
| Route 53 | python3-certbot-dns-route53 | sudo apt install python3-certbot-dns-route53 |
| DigitalOcean | python3-certbot-dns-digitalocean | sudo apt install python3-certbot-dns-digitalocean |
| Google Cloud | python3-certbot-dns-google | sudo apt install python3-certbot-dns-google |
方案 B:手动 DNS 验证
如果您的 DNS 服务商没有 Certbot 插件:
sudo certbot certonly --manual --preferred-challenges dns \
-d yourdomain.com -d "*.yourdomain.com"
Certbot 会要求您创建一条 TXT 记录,按提示操作即可。
手动验证注意事项: 您需要每 90 天手动续期,每次续期都要更新 DNS TXT 记录。
方案 C:付费通配符证书
可从以下服务商购买:
- Comodo/Sectigo(约 $70/年)
- DigiCert(约 $400/年)
- RapidSSL(约 $125/年)
第三步:配置 Web 服务器
请参阅以下文档中的通配符部分:
关键:Apache 使用 ServerAlias *.yourdomain.com,Nginx 使用 server_name yourdomain.com *.yourdomain.com;。
第四步:验证配置
# 测试子域名 DNS 解析
dig test.yourdomain.com
# 应在 ANSWER 部分返回您的服务器 IP
# 使用 curl 测试
curl -I https://anything.yourdomain.com
# 应返回 200 或重定向(而非"无法解析主机名")
第五步:配置 FeedbackPulse
更新您的 .env 文件:
# 设置 Session 域名以允许跨子域名使用 Cookie
SESSION_DOMAIN=.yourdomain.com
# 主应用 URL(不含子域名)
APP_URL=https://yourdomain.com
注意
SESSION_DOMAIN=.yourdomain.com中的前导点号 — 这样 Session Cookie 才能在所有子域名间正常工作。
FeedbackPulse 中子域名的工作原理
当请求到达 acme.yourdomain.com 时:
ResolveTenant中间件提取子域名(acme)- 查找
subdomain = 'acme'的租户 - 找到后,将该租户设置为当前上下文
- 用户看到该租户的登录页面或仪表板
租户在注册时设置自己的子域名,您也可以在管理面板中手动设置。