RewriteCond和RewriteRule工作正常,除非不使用路径



我有一个新域,需要通过Apache中的代理加载旧域的内容。这已经可以正常工作了:

<VirtualHost myserver:80>
ServerName newdomain.com
ServerAlias www.newdomain.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^newdomain.com$
RewriteRule ^(.*)$ https://olddomain.com/$1 [P]
</VirtualHost>

例如:

  • newdomain.com/contact负载olddomain.com/contact
  • newdomain.com/catalogue/342负载olddomain.com/catalogue/342

但是当我尝试这个时问题来了:

  • newdomain.com(没有任何附加路径)。返回404错误。

我猜这个问题是在RewriteCond/RewriteRule定义,但我似乎找不到问题。什么好主意吗?谢谢!

RewriteRule ^(.*)$ https://olddomain.com/$1 [P]

因为该规则是在virtualhost上下文中定义的,所以RewriteRule模式匹配的url路径是相对于根的,并且以斜杠开始。由于这是在替换字符串中捕获并使用的,因此它将在目标url -路径的开始处产生双斜杠。

也许这是抛弃了主页的路由。

试试下面的命令:

RewriteRule ^/(.*)$ https://olddomain.com/$1 [P]

也不需要前面的RewriteCond指令,因为您已经在vHost中用于newdomain.com,并且当前条件省略了www.newdomain.com,这可能不是意图。


或者根本不要使用mod_rewrite,因为它似乎是一个直接的一对一代理。

例如:

ProxyPass / https://olddomain.com/
ProxyPassReverse / https://olddomain.com/