2017-01-23 121 views
2

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

我使用下列指令:

<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但不会重写URL。所以我从Web浏览器中得到一个SSL证书域不匹配的错误。

第二个VirtualHost指令有什么问题会阻止URL被重写吗?

+0

注释掉'RewriteCond%{SERVER_PORT}^443(s)'行并在清除浏览器缓存后重新测试。 – anubhava

+0

我得到相同的行为。 –

回答

0

必须验证SSL证书才能发出重定向,因此您需要使用在发出https://A.org/重定向的VirtualHost中对“A.org”有效的证书,并将其从VirtualHost服务https://B.org/

线路检查服务器端口不是必需的,因为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>