我有一个通配符 SSL 证书,我想将所有 http 请求重定向到其等效的 https。
我的服务器是 Debian(wheezy),运行的是 Apache 2.2.22
我在 /etc/apache2/apache2.conf 末尾添加了以下内容
<VirtualHost *:80>
ServerName domain.tld
ServerAlias *.domain.tld
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerName domain.tld
ServerAlias *.domain.tld
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
SSLEngine on
SSLCertificateFile /path/file.crt
SSLCertificateKeyFile /path/file.key
SSLCertificateChainFile /path/file.crt
SSLCACertificateFile /path/file.pem
</VirtualHost>
这对子域名很有效,但对裸域名则不然(http://www.域名.tld转到 https 但是http://域名.tld才不是)
我缺少的是什么?
答案1
如果只针对一个域名,那么你可以在 .htaccess 中执行此操作
RewriteEngine on
RewriteCond %{HTTPS} !^on$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
以下内容对于保护从 http 重定向到 https 的会话也很有用
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"
</IfModule>
答案2
由于您为虚拟主机定义了一条全面规则,我能看到的唯一原因是裸域由其他虚拟主机提供服务。但是,如果情况确实如此,您应该在 apache 重新启动时收到相应的警告。
此外,我想知道当将 Strict-Transport-Security 应用于端口 80 上的 vhost 时,它会做什么。此标头应仅适用于 https。
要检查重写规则是否被使用以及它们在做什么,只需添加 Rewritelogging 的指令,例如:RewriteLogLevel 256 RewriteLog“/tmp/rewrite.log”
日志非常冗长,因此在分析(可能发布)日志输出后,请务必删除这些行。
答案3
我已将计算机的主机名设置为与 VirtualHost 相同,因此它们都是 domain.tld。这就是导致 VirtualHost 规则不适用于裸域的原因。当我将计算机的主机名更改为中性名称并重新启动时,VirtualHost 设置按预期工作。