将裸域名重定向至 SSL

将裸域名重定向至 SSL

我有一个通配符 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 设置按预期工作。

相关内容