在我的Apache服务器,我想能够重定向所有传入的HTTP请求等效HTTPS请求。 美中不足的是,我希望能够做到这一点对我的默认虚拟主机不指定ServerName
,并与任何服务器名重定向的作品出现在请求URL。 我希望这样的事情:
NameVirtualHost *:80
<VirtualHost *:80>
RedirectPermanent / https://%{SERVER_NAME}/
...
</VirtualHost>
这可能使用Redirect
,否则我将不得不诉诸Rewrite
?
尝试在你的虚拟主机的配置添加此:
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
这两个工作正常。 但根据Apache的文档 ,你应该避免使用mod_rewrite
简单的重定向,并且使用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 /one/ http://one.example.com/
这是为了省去不必要的重定向的完整的方式,太;)
这些规则意在.htaccess文件中使用,如在*一个重写规则:80 VirtualHost条目,不需要条件。
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
Eplanations:
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的最后一条规则。