我的Apache 2.4 conf文件如下:
Listen 80
Listen 443 https
NameVirtualHost *:443
#
<VirtualHost *:443>
ServerAdmin admin@example.com
DocumentRoot "/home/websites/example/www"
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile "/path/to/www.example.com.cert"
SSLCertificateKeyFile "/path/to/www.example.com.key"
# HSTS (mod_headers is required) (63072000 seconds = 2years)
Header always set Strict-Transport-Security "max-age=63072000;includeSubDomains;"
RewriteEngine On
RewriteCond %{HTTP:Host} ^example.com$
RewriteRule (.*) http://www.example.com$1 [NC,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
我的想法:
与<VirtualHost *:443>
一样,<VirtualHost
中的任何设置仅在apache侦听端口443
时才有效,然后RewriteCond %{HTTPS} !=on
永远不会变为true,然后http://
将不会切换为https://
。
然后,如何编写Apache conf文件以将virtualhost *:443
切换为http://
到https://
?
答案 0 :(得分:1)
您的问题的标题是矛盾的-您是否希望端口80上的行为与443相同?您是否要将所有端口80流量发送到端口443?由于您代码中的注释中提到了HSTS,因此我将假设后者。
为端口80声明一个默认主机,然后重定向该虚拟主机中的所有流量。我强烈建议您使用302而不是301重定向,至少要等到配置按您希望的方式工作为止。
<VirtualHost *:80>
ServerAdmin admin@example.com
DocumentRoot "/home/websites/example/EMPTYDIR"
ServerName example.com
RewriteEngine On
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
(顺便说一句,使用您的默认值来处理显式命名的虚拟主机有点麻烦)。