Apache 重定向到 HTTPS:HTTP 自动跳转配置
本文目录
Apache 可以通过重定向规则,将网站的 HTTP 请求自动跳转到 HTTPS。本文介绍 Apache 2.4 中两种常用方法:在虚拟主机中使用 Redirect,以及在 .htaccess 中使用 mod_rewrite。
前提条件:网站已安装有效证书,能够通过 HTTPS 正常访问。以下示例适用于 Apache 直接提供 HTTPS 的环境,请将 www.example.com 替换为实际域名。两种方法按需选择一种即可。
一、在虚拟主机中配置重定向
如果可以修改 Apache 的站点配置,推荐在网站的 80 端口虚拟主机中添加 Redirect 指令。
整站重定向到 HTTPS
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent "/" "https://www.example.com/"
</VirtualHost>
permanent 表示返回 301 永久重定向。访问 HTTP 地址时,浏览器会跳转到对应的 HTTPS 地址,原有路径和查询参数会保留。
例如,访问 http://www.example.com/docs/page.html,将跳转到 https://www.example.com/docs/page.html。
注意:这条规则只放在处理 HTTP 的虚拟主机中,443 端口虚拟主机继续提供正常的 HTTPS 内容。
只重定向指定目录
如果只需要将 /secure 及其下级路径重定向到 HTTPS,可以在现有的 80 端口虚拟主机中,使用下面这条规则替代整站重定向规则:
Redirect permanent "/secure" "https://www.example.com/secure"
例如,http://www.example.com/secure/account.html 将跳转到 https://www.example.com/secure/account.html,其他路径不受这条规则影响。
二、使用 .htaccess 重定向到 HTTPS
如果无法修改虚拟主机配置,可以在网站根目录的 .htaccess 文件中添加:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
RewriteEngine On:开启重写引擎。RewriteCond %{HTTPS} !=on:仅在当前连接未使用 HTTPS 时执行跳转,避免 HTTPS 请求反复重定向。%{REQUEST_URI}:保留请求路径;本例未设置新的查询字符串,原查询参数也会保留。R=301:返回 301 永久重定向。L:停止处理本轮后续重写规则。
此方法要求服务器已加载 mod_rewrite,并允许该目录通过 .htaccess 使用相关指令,例如配置了 AllowOverride FileInfo 或相应的 AllowOverrideList 权限。
WordPress 网站可以将上述规则放在 # BEGIN WordPress 标记之前。
三、使配置生效并检查结果
修改虚拟主机配置后,需要检查配置并重新加载 Apache。提供 apachectl 的 Linux 环境可以先执行:
sudo apachectl configtest
检查通过后,再执行:
sudo apachectl graceful
不同安装方式的管理命令可能不同,请以实际环境为准。单独修改 .htaccess 通常不需要重新加载 Apache。
使用以下命令检查重定向:
curl -I http://www.example.com/
确认响应状态为 301,且 Location 指向正确的 HTTPS 地址,再检查文章页等其他路径是否正常。
测试期间可以先使用 302 临时重定向:将 permanent 改为 temp,或将 R=301 改为 R=302;确认无误后再改为 301。
代理环境说明:如果 HTTPS 由前置 CDN 或反向代理处理,而代理通过 HTTP 连接 Apache,上述协议判断可能引起循环跳转。这种情况下应在前置代理配置跳转,或结合可信代理提供的原始协议信息调整规则。

