在没有ServerName的默认虚拟主机上将HTTPredirect到HTTPS

在我的apache服务器上,我希望能够将所有传入的http请求redirect到相应的https请求。 问题是,我希望能够在没有指定ServerName情况下为我的默认虚拟主机执行此操作,并将redirect与请求url中出现的任何服务器名称一起使用。 我希望有这样的事情:

 NameVirtualHost *:80 <VirtualHost *:80> RedirectPermanent / https://%{SERVER_NAME}/ ... </VirtualHost> 

这可能使用Redirect或我将不得不求助于Rewrite

尝试添加这个在你的虚拟主机configuration:

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

两者都很好。 但根据Apache文档,您应该避免使用mod_rewrite进行简单的redirect,而是使用Redirect 。 所以根据他们,你最好做:

 <VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost> 

第一个/ Redirect之后是url,第二个部分是它应该被redirect的地方。

您也可以使用它将urlredirect到一个子域名: Redirect /one/ http://one.example.com/

这也是省略不必要的redirect的完整方法;)

这些规则旨在用在.htaccess文件中,因为*:80 VirtualHost条目中的RewriteRule不需要条件。

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

计划

 RewriteEngine on 

==>启用引擎

 RewriteCond %{HTTPS} off [OR] 

==>匹配非https连接,或者(不设置[OR]会导致隐式的AND!)

 RewriteCond %{HTTP:X-Forwarded-Proto} !https 

==>匹配转发连接(代理,负载均衡等) 没有 https

 RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

==>如果这两个条件中的一个匹配,则重写整个URL,发送一个301来让客户端(有些做,有些不知道)学习这个,最后一个规则是L.