在 Apache 中将 HTTP 重定向到 HTTPS
本指南介绍了如何在 Apache 中将 HTTP 流量重定向到 HTTPS 。
Apache HTTP 服务器是世界上最受欢迎的 Web 服务器之一。这是一个开放源代码和跨平台的 HTTP 服务器,为 Internet 的很大一部分网站提供支持。 Apache 提供了许多强大的功能,还可以通过其他模块进行扩展。
如果您是网站所有者或系统管理员,则很可能会定期与 Apache 打交道。您可能要执行的最常见任务之一是将 HTTP 流量重定向到网站的安全 (HTTPS) 版本。
HTTP 以纯文本形式发送和返回请求和响应,与 HTTP 不同,HTTPS 使用 TLS/SSL 加密客户端和服务器之间的通信。
通过 HTTP 使用 HTTPS 有许多优点,例如:
- 所有数据都是双向加密的。如果被拦截了敏感信息,则无法读取出来。
- Google Chrome 浏览器和所有其他流行的浏览器都会将您的网站标记为安全。
- HTTPS 允许您使用 HTTP/2 协议,这可以显着提高站点性能。
- Google 偏爱 HTTPS 网站。如果通过 HTTPS 提供服务,则您的网站排名将会更高。
在 Apache 中,有几种方法可以重定向到 HTTPS 。如果您具有运行 Apache 的 Linux 服务器的超级用户访问权限,则首选方法是在域的虚拟主机配置文件中设置重定向。否则,您可以在域的 .htaccess
文件中设置重定向。
某些控制面板(例如 cPanel) 使您可以通过单击几下鼠标来强制 HTTPS 重定向。
使用虚拟主机将 HTTP 重定向到 HTTPS
Apache 虚拟主机定义服务器上托管的一个或多个域的设置。在虚拟主机指令中,您可以指定站点文档根目录(包含网站文件的目录),为每个站点创建单独的安全策略,使用不同的 SSL 证书,配置重定向等等。
通常,当在域上安装 SSL 证书时,您将对该域配置两个虚拟主机指令。第一个用于端口 80 的站点的 HTTP 版本,另一个用于端口 443 的 HTTPS 版本。
在基于 Red Hat 的发行版(如 CentOS 和 Fedora) 中,虚拟主机文件存储在 /etc/httpd/conf.d
中。在 Debian 及其衍生版本(如 Ubuntu) 上时,文件存储在 /etc/apache2/sites-available
目录中。
要将网站重定向到 HTTPS ,请使用 Redirect
以下示例中所示的指令:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent/https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
Protocols h2 http:/1.1
# SSL Configuration
# Other Apache Configuration
</VirtualHost>
让我们解释一下代码。我们使用的是两个虚拟主机指令,一个用于 HTTP ,一个用于 HTTPS 版本的站点。
VirtualHost *:80
- Apache 服务器在端口 80(HTTP) 上侦听指定域的传入连接。VirtualHost *:443
- Apache 服务器在端口 443(HTTPS) 上侦听指定域的传入连接。
ServerName
和 ServerAlias
指令都指定虚拟主机的域名。确保将其替换为您自己的域名。
Redirect permanent/https://example.com/
HTTP 虚拟主机内部的突出显示的行将流量重定向到站点的 HTTPS 版本。
通常,您还希望将站点的 HTTPS www 版本重定向到非 www ,反之亦然。这是一个示例配置:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent/https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
Protocols h2 http:/1.1
<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent/https://example.com/
</If>
# SSL Configuration
# Other Apache Configuration
</VirtualHost>
HTTPS 虚拟主机内的代码正在检查请求标头是否包含 www 域并重定向到非 www 版本。
每当您对配置文件进行更改时,都需要重新启动或重新加载 Apache 服务,以使更改生效:
-
Debian和 Ubuntu :
sudo systemctl reload apache2
-
CentOS和 Fedora :
sudo systemctl reload httpd
使用 .htaccess
重定向 HTTP 到 HTTPS
.htaccess
是 Apache Web 服务器按目录的配置文件。该文件可用于定义 Apache 如何从放置文件的目录中提供文件,以及启用/禁用其他功能。
通常,该 .htaccess
文件位于域根目录中,但是您可以在子目录中包含其他的 .htaccess
文件。
此方法要求将 mod_rewrite
模块加载到 Apache 服务器上。默认情况下,此模块在大多数服务器上加载。如果可能的话,最好在虚拟主机中创建重定向,因为它更简单,更安全。
要将所有 HTTP 通信重定向到 HTTPS ,请打开根 .htaccess
文件,然后向其中添加以下代码:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
代码是什么意思:
RewriteEngine On
- 启用重写功能。RewriteCond %{ HTTPS } off
- 检查 HTTP 连接,如果满足条件,则执行下一行。RewriteRule ^ (.*)$ https://example.com/$1 [L,R=301]
- 使用状态代码 301( 永久移动)将 HTTP 重定向到 HTTPS 。
下面的示例还有一个附加条件,用于检查请求是否以开头 www
。使用它强制所有访问者使用网站的 HTTPS 非 www 版本:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
编辑 .htaccess
文件时,无需重新启动服务器,因为 Apache 会在每个请求中读取文件。
结论
在 Apache 中,将 HTTP 重定向到 HTTPS 的首选方法是在域的虚拟主机中配置 301 重定向。