在Apache 2.4.6中,我想将请求从http://A.org/foo
和https://A.org/foo
redirect到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
,它redirect到https://B.org/foo
(正确)。
当我访问https://A.org/foo
,会加载https://B.org/foo
但不会重写URL。 所以我从Web浏览器得到一个SSL证书域不匹配的错误。
第二个VirtualHost
指令有什么问题会阻止URL被重写吗?
必须验证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>