使用 HSTS 进行 Apache 重定向

使用 HSTS 进行 Apache 重定向

我需要将所有 重定向example.comhttps://www.example.com并启用 HSTS。怎么做?我在 vhost80 和 vhost443 中进行了配置。此代码中需要修复的内容:

在 vhost 80 中

RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =*.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

在虚拟主机 443

RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule (.*) https://www.example.com$1 [R=301,L]

答案1

假设您只有两个 vHost 容器。一个用于端口 80,仅处理对 和 的请求example.comwww.example.com另一个用于端口 443,同样仅处理对example.comwww.example.com的请求。然后...

RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =*.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

您只需删除所有条件,只需指令RewriteRule即可。例如:

RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [END,NE,R=permanent]

您还需要确保重定向到相同的主机名,因此使用HTTP_HOST,而不是SERVER_NAME。 (尽管默认情况下SERVER_NAME与 - 相同HTTP_HOST,但这取决于UseCanonicalName服务器配置中的指令。)

vHost 443 容器中的规则看起来“OK”。

然而,最佳做法是完全避免使用 mod_rewrite...为每个主机名创建一个单独的 vHost,并使用更简单的 mod_aliasRedirect指令。

答案2

为了完整起见,下面是更简单的mod_aliasMrWhite 建议的替代方案。这也将 HSTS 标头放在了正确的位置,并且如建议的那样,包括了子域并进行了预加载。首先是三个重定向虚拟主机,然后是实际的虚拟主机提供内容。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    Redirect permanent / https://www.example.com/

    # The mandatory SSL* directives.

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/html

    # The mandatory SSL* directives.
    # . . . whatever else you may have here

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

当然,这需要 mod_alias 和mod_headers已加载。将Header指令包装在<IfModule>部分内可以避免缺少 mod_headers 模块的错误,但这样您就不会启用 HSTS,而这被称为使用 HSTS 进行重定向。


这两个<VirtualHost *:80>区块之所以存在是因为:

  • 有一个限制:您不能将变量%{SERVER_NAME}与 一起使用Redirect
  • 使用 HSTS 时建议先重定向到 HTTPS,然后再重定向到规范名称。

对于通配符*.example.com重定向我会ServerAlias先将 添加到 重定向VirtualHosts *:80到域顶点,然后再在 HTTPS 上添加。由于www包含在 中*.example.com,您甚至不需要<VirtualHost *:80>为其添加其他内容:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com
    Redirect permanent / https://www.example.com/
    . . .

这样,用户...

  1. 输入 URL http://anysub.example.com/
  2. 重定向到https://example.com/(或者已经在相同的配置中,如果输入了https://anysub.example.com/,或者 HSTS 策略已经在缓存中)。
  3. 查看 HSTS 标头,保护(*.)*.example.com包括在内的所有内容anysub.example.com
  4. 最终重定向到规范的https://www.example.com/

相关内容