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

hig*_*ted 68 apache https redirect http

在我的apache服务器上,我希望能够将所有传入的http请求重定向到等效的https请求.问题是,我希望能够为我的默认虚拟主机执行此操作,而无需指定,ServerName并且重定向可以使用请求URL中显示的任何服务器名称.我希望这样的事情:

NameVirtualHost *:80
<VirtualHost *:80>
    RedirectPermanent / https://%{SERVER_NAME}/
    ...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这可能是使用Redirect还是我必须诉诸Rewrite

Jon*_*Lin 100

尝试在vhost配置中添加:

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

  • 您可能需要在**RewriteEngine On**之后添加**RewriteCond%{HTTPS} off**否则您可能会获得**ERR_TOO_MANY_REDIRECTS** (13认同)
  • @Dunatotatos 在虚拟主机中,URI 包含前导“/”,但在 htaccess 文件中,“/”前缀被删除。如果规则位于 htaccess 文件中,我们确实需要在“$1”之前有一个“/” (2认同)

ors*_*zky 83

两者都很好.但是根据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>
Run Code Online (Sandbox Code Playgroud)

第一/Redirect是URL,第二部分是,它应该被重定向.

您还可以使用它将URL重定向到子域: Redirect /one/ http://one.example.com/

  • 这不回答**没有指定ServerName**问题的一部分 (35认同)

Jim*_*ing 35

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

这些规则旨在用于.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]
Run Code Online (Sandbox Code Playgroud)

Eplanations:

RewriteEngine on
Run Code Online (Sandbox Code Playgroud)

==>启用引擎

RewriteCond %{HTTPS} off [OR]
Run Code Online (Sandbox Code Playgroud)

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

RewriteCond %{HTTP:X-Forwarded-Proto} !https
Run Code Online (Sandbox Code Playgroud)

==>在没有 https的情况下匹配转发的连接(代理,负载均衡器等)

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

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

  • 在这种情况下,RewriteCond完全是多余的; 由于VirtualHost已被定义为"<VirtualHost*:80>",因此`%{SERVER_PORT}`将永远不会是443,因此条件将始终匹配. (9认同)