将http和https请求重定向到新主机

时间:2017-01-23 21:49:07

标签: apache .htaccess redirect ssl

在Apache 2.4.6中,我想将http://A.org/foohttps://A.org/foo的请求重定向到https://B.org/foo

我使用以下指令:

<VirtualHost 1.2.3.4:80>
     ServerName B.org
     ServerAlias A.org
     RewriteEngine on
     RewriteCond %{HTTP_HOST} !^B.org$
     RewriteRule ^/(.*)$ https://B.org/$1 [R=permanent,L]
</VirtualHost>

<VirtualHost 1.2.3.4:443>
     ServerName B.org
     ServerAlias A.org
     RewriteEngine on
     RewriteCond %{SERVER_PORT} ^443(s)
     RewriteCond %{HTTP_HOST} !^B.org$
     RewriteRule ^/(.*)$ https://B.org/$1 [R=permanent,L]
</VirtualHost>

当我访问http://A.org/foo时,会重定向到https://B.org/foo(正确)。

当我访问https://A.org/foo时,会加载https://B.org/foo,但不会重写该网址。因此,我从Web浏览器中收到SSL证书域不匹配错误。

第二个VirtualHost指令是否有问题会导致URL被重写?

1 个答案:

答案 0 :(得分:0)

在发布重定向之前,必须验证SSL证书,因此您需要使用对“A.org”有效的证书。在从https://A.org/发出重定向的VirtualHost中,并将其与提供给https://B.org/的VirtualHost分开。

行检查服务器端口不是必需的,因为VirtualHost无论如何只服务该端口。只需删除它。

这里有一个规则的大纲,也略微调整了你可能喜欢或不喜欢的美学!

<VirtualHost 1.2.3.4:80>
     ServerName B.org
     ServerAlias A.org
     RewriteEngine on
     RewriteCond %{HTTP_HOST} !=B.org
     RewriteRule ^(.*)$ https://B.org$1 [R=permanent,L]
</VirtualHost>

<VirtualHost 1.2.3.4:443>
     ServerName A.org
     RewriteEngine on
     RewriteRule ^(.*)$ https://B.org$1 [R=permanent,L]
</VirtualHost>

<VirtualHost 1.2.3.4:443>
     ServerName B.org
</VirtualHost>