我需要将所有 重定向example.com
到https://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.com
;www.example.com
另一个用于端口 443,同样仅处理对example.com
和www.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/
. . .
这样,用户...
- 输入 URL
http://anysub.example.com/
。 - 重定向到
https://example.com/
(或者已经在相同的配置中,如果输入了https://anysub.example.com/
,或者 HSTS 策略已经在缓存中)。 - 查看 HSTS 标头,保护
(*.)*.example.com
包括在内的所有内容anysub.example.com
。 - 最终重定向到规范的
https://www.example.com/
。