将裸体域redirect到SSL

我有一个通配符SSL证书,我想redirect所有的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.domain.tld去https,但http://domain.tld不)

我错过了什么?

如果只是一个域,那么你可以在.htaccess中做到这一点

 RewriteEngine on RewriteCond %{HTTPS} !^on$ RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L] 

以下内容对保护从httpredirect到https的会话也很有用

 <IfModule mod_headers.c> Header set Strict-Transport-Security "max-age=16070400; includeSubDomains" </IfModule> 

正如你已经为你的虚拟主机定义了全面的规则,我能看到的唯一原因是,裸域由其他虚拟主机提供服务。 但是,如果是这样的话,你应该在apache重启时收到适当的警告。

除此之外,我还想知道当Strict-Transport-Security应用于端口80上的虚拟主机时,它应该做什么。

要检查是否使用重写规则以及它们在做什么,只需添加Rewritelogging的指令,例如:RewriteLogLevel 256 RewriteLog“/tmp/rewrite.log”

日志是非常详细的,所以一定要删除这些行后,分析(也许张贴)日志的输出。

我已经将我的机器的主机名设置为与VirtualHost相同,所以它们都是domain.tld这是导致VirtualHost规则不适用于裸域的原因。 当我将机器的主机名更改为中性并重新启动时,VirtualHost设置按预期工作。