.htaccess RewriteRule和RewriteCond

时间:2015-03-03 15:23:10

标签: apache .htaccess mod-rewrite redirect

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

中有我的网站的新版本
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 /不管即可。除了“客户”文件夹,我还有另外两个。

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

Options +FollowSymLinks 
RewriteEngine On

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

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

我已经尝试过这个文件的这么多变种,但仍然无法获得合适的行为。

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

1 个答案:

答案 0 :(得分:2)

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

你最终会得到以下内容:

Options +FollowSymLinks 
RewriteEngine On

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

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