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