.htaccess RewriteRule 和 RewriteCond

.htaccess RewriteRule and RewriteCond

我已经为这个问题苦苦挣扎了几个小时。 基本上我在

中有我网站的新版本
var/www/mynewsite/public

我的 www/ 文件夹中有一个指向这样的符号链接

www/v2_legacy -> /d1/v2_legacy/

现在,我需要将访问 www.mysite.com 的任何人重定向到 www.mysite.com/mynewsite/public/

但我还需要保留一些旧链接,因此,访问 www.mysite。com/clients/whatever 应该将用户重定向到 www.mysite.com/v2_legacy/clients/whatever。除了 "clients" 文件夹外,我还会有另外两个文件夹。

这是我的 .htaccess,位于 www/ 文件夹中:

Options +FollowSymLinks 
RewriteEngine On

RewriteRule ^clients/(.*)$ v2_legacy/clients/ [L]

RewriteCond %{REQUEST_URI} !^v2_legacy/(.*)$
RewriteRule ^(.*)$ mynewsite/public/ [L]

我已经尝试了这个文件的许多变体,但仍然无法获得适当的行为。

使用上面的 htaccess 文件,访问 www.mysite.com 将正确重定向,但访问 www.mysite.com/clients/somestuff 则不会。但是,如果我注释掉最后一个 RewriteCond 和 RewriteRule,访问 www.mysite.com/clients/somestuff 将正常工作,但访问 www.mysite.com,显然将无法工作。

%{REQUEST_URI} 变量始终以斜杠开头。因此,将它与 ^something 匹配将始终为假(并且否定使它始终为真)。除此之外,您还需要防止无限循环的发生,因为 ^(.*)$ 也匹配 mynewsite/public/...

你最终会得到类似以下内容的结果:

Options +FollowSymLinks 
RewriteEngine On

RewriteRule ^clients/(.*)$ v2_legacy/clients/ [L]

RewriteCond %{REQUEST_URI} !^/(v2_legacy|mynewsite)
RewriteRule ^(.*)$ mynewsite/public/ [L]