Apache全站强制HTTPS需配置两个虚拟主机:80端口仅做301跳转,443端口启用SSL并指定证书路径、文档根目录;同时确保mod_ssl已安装启用、防火墙开放443端口、证书文件权限正确。

要在 Linux 中让 Apache 实现全站强制 HTTPS,核心是两件事:一是让 443 端口能正确提供 HTTPS 服务,二是把所有 HTTP(80 端口)请求无条件、永久跳转到对应 HTTPS 地址。不能只配 SSL 而不跳转,否则用户仍可能用 http 访问;也不能只做跳转却不启用 SSL,那样会跳到一个不可用的地址。
确保系统和模块已就绪
先确认基础环境是否满足:
- 运行
httpd -v或apache2 -v,Apache 版本建议 ≥ 2.4.8(支持 SNI,方便多域名) - 执行
sudo yum install mod_ssl openssl(CentOS/RHEL)或sudo apt install apache2 openssl(Ubuntu/Debian) - 检查 SSL 模块是否加载:
apachectl -M | grep ssl,应看到ssl_module (shared) - 开放防火墙 443 端口:
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload
准备并放置证书文件
证书必须包含三部分:域名证书(.crt 或 .pem)、私钥(.key)、中间证书链(chain.crt 或合并进主证书)。推荐统一存放在 /etc/ssl/mydomain/ 并设权限:
sudo chmod 600 /etc/ssl/mydomain/private.keysudo chmod 644 /etc/ssl/mydomain/cert.pem /etc/ssl/mydomain/chain.pem- 若用 Let’s Encrypt,证书通常在
/etc/letsencrypt/live/yourdomain/下,直接引用即可
配置两个独立虚拟主机
这是关键——不能混在一个 里处理 HTTP 和 HTTPS。必须分开:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 80 端口虚拟主机:只做 301 跳转,不设文档根目录
- 443 端口虚拟主机:启用 SSL,指定证书路径,设置真实站点目录
示例配置(写入 /etc/httpd/conf.d/ssl.conf 或 /etc/apache2/sites-available/your-site.conf):
ServerName example.com
ServerAlias www.example.com
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/mydomain/cert.pem
SSLCertificateKeyFile /etc/ssl/mydomain/private.key
SSLCertificateChainFile /etc/ssl/mydomain/chain.pem
Require all granted
验证与重启
配置完成后别直接重启:
- 先语法检查:
sudo apachectl configtest(CentOS)或sudo apache2ctl configtest(Ubuntu),输出Syntax OK才继续 - 启用站点(Ubuntu):
sudo a2ensite your-site.conf;禁用默认 HTTP 站点可选 - 重启服务:
sudo systemctl restart httpd(CentOS)或sudo systemctl restart apache2(Ubuntu) - 浏览器访问
http://example.com,应自动跳转到https://example.com,地址栏显示锁图标










