在没有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.