在 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) 上侦听指定域的传入连接。

ServerNameServerAlias 指令都指定虚拟主机的域名。确保将其替换为您自己的域名。

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 重定向。