在Apache 2.4.6中,我想将http://A.org/foo
和https://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被重写?
答案 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>