核心目标是统一访问入口:所有HTTP/带www请求均301跳转至HTTPS主域名。需三者协同——SSL证书覆盖example.com与www.example.com、80端口VirtualHost做协议跳转、443端口VirtualHost处理子域归一,并启用mod_ssl和mod_rewrite,验证语法后重载服务。

Apache 中 SSL 证书与域名重定向配合,核心目标是让用户无论输入 http://example.com、www.example.com 还是直接输域名,最终都稳定访问到 https://example.com(或统一为带 www 的 HTTPS),整个过程对用户透明、无报错、不中断。这不是简单加个跳转,而是证书配置 + 虚拟主机结构 + 重定向逻辑三者协同的结果。
一、证书必须覆盖所有可能被访问的域名
如果用户常输 example.com 和 www.example.com,那你的 SSL 证书就必须同时包含这两个域名(即 SAN 域名证书)。单域名证书只认其中一个,另一个在 HTTPS 访问时会触发浏览器“您的连接不是私密连接”警告,重定向就失败了。
常见做法:
- 申请时勾选“自动包含 www”选项(多数免费/付费 CA 都支持)
- 使用 Let’s Encrypt 时用
certbot -d example.com -d www.example.com - 确认证书内容:运行
openssl x509 -in /path/to/cert.pem -text -noout | grep -A1 "Subject Alternative Name",看到两行 DNS 域名才算完整
二、两个独立虚拟主机缺一不可
Apache 必须同时定义一个监听 80 端口的 HTTP 主机(负责接收原始请求并跳转),和一个监听 443 端口的 HTTPS 主机(负责真正提供加密服务)。不能只配 443 然后指望它自己处理 http 请求。
典型结构(放在 /etc/apache2/sites-available/example.conf):
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.pem
SSLCertificateKeyFile /etc/ssl/private/example.com.key
# 其他常规配置(DocumentRoot、Directory 等)
</VirtualHost>
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
注意:Redirect permanent 比 Rewrite 更简洁安全,且明确返回 301,利于 SEO;ServerAlias 在两个 VirtualHost 中都要写全,确保两个域名都能被正确路由。
三、避免重定向循环的关键细节
常见错误是 HTTPS 主机内部又做了一次跳转(比如把 www.example.com 再跳到 example.com),而没处理好 Host 判断逻辑,导致反复跳转甚至报错 ERR_TOO_MANY_REDIRECTS。
稳妥做法分两步走:
- 先统一协议:用 80 端口的 VirtualHost 把所有 HTTP 请求强制导向 HTTPS(不管带不带 www)
- 再统一子域:在 443 端口的 VirtualHost 内部,用 Rewrite 或 Redirect 区分处理,例如只让
www.example.com→https://example.com,而example.com直接服务
HTTPS 内部跳转示例(加在 443 的 VirtualHost 里):
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com$1 [R=301,L]
四、别漏掉基础环境准备
再正确的配置,若底层不通,HTTPS 也起不来:
- 确保
a2enmod ssl rewrite已执行,且mod_ssl和mod_rewrite在apache2ctl -M输出中可见 - 云服务器安全组 / 防火墙必须放行 443 端口(不只是 80)
- 证书文件路径权限合理(私钥一般
600,证书644),Apache 用户(如 www-data)要有读取权限 - 修改完配置务必运行
sudo apache2ctl configtest验证语法,再sudo systemctl reload apache2

















