如何通过apache conf文件将apache virtualhost从“ http”切换到“ https”?

时间:2018-10-30 16:48:20

标签: apache

我的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://

1 个答案:

答案 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>

(顺便说一句,使用您的默认值来处理显式命名的虚拟主机有点麻烦)。