首页 文章

在没有ServerName的默认虚拟主机上将HTTP重定向到HTTPS

提问于
浏览
63

在我的apache服务器上,我希望能够为我的默认虚拟主机执行此操作而不指定 ServerName ,并且重定向可以使用请求URL中显示的任何服务器名称 . 我希望这样的事情:

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

这可能是使用 Redirect 还是我必须求助于 Rewrite

3 回答

  • 33

    这是省略不需要的重定向的完整方法;)

    这些规则旨在用于.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]
    

    Eplanations

    RewriteEngine on
    

    ==>启用引擎

    RewriteCond %{HTTPS} off [OR]
    

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

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

    ==>匹配转发的连接(代理,负载均衡器等) without https

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

    ==>如果两个条件中的一个匹配,则重写整个URL,发送301以使客户端“学习”(有些人做,有些人没有)和L用于最后一个规则 .

  • 73

    尝试在vhost配置中添加:

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

    两者都很好 . 但根据Apache docs,你应该避免使用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/

相关问题