Apache重写规则打破对方?

我有这个规则:

RewriteCond %{REQUEST_URI} ^/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$ RewriteCond %{REQUEST_URI} !^/guide/(.*)$ RewriteRule ^(.*)$ /home/neezer/public-html/domain.com/guide/$1 [L] 

这是自己的伟大的作品。 从本质上讲,我有一堆目录,其中有一堆文件,我想保留在“/指南”文件夹,但我希望他们出现在网站的search引擎优化的原因。

这个规则是有效的,但不幸的是,原来的URL仍然工作(用“/指南”)。 我想301将URL中的“/ guide”redirect到那些没有的,实际上没有移动服务器上的文件。

我试着添加这个规则:

 RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$ RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L] 

…但是完全违反了我的第一条规则。

有关我可能做错什么的想法? 请让我知道,如果你需要了解我的其他事情来帮助我解决这个问题。


编辑:每马修斯的build议,我已经改变了我的规则(这反映了我想要的行为):

 RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L] RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$1-apartments/$2 [L] 

不过,这次的规则仍然是互相冲突的, 尝试访问由第二个规则(以及第一条规则正确redirect到的内容)所控制的页面在Safari中给我这个错误:

尝试打开“ http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php ”时发生太多redirect。 如果您打开redirect的页面打开另一个页面,然后redirect到打开原始页面,则可能会发生这种情况。

有什么build议么?


进一步编辑:

看来这些规则正在循环上去。 以下是重写日志的摘录:

 init rewrite engine with requested uri /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php pass through /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [perdir /home/neezer/public-html/domain.com/] rewrite 'manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> '/home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' [perdir /home/neezer/public-html/domain.com/] strip document_root prefix: /home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php -> /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [perdir /home/neezer/public-html/domain.com/] internal redirect with /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [INTERNAL REDIRECT] init rewrite engine with requested uri /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php pass through /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [perdir /home/neezer/public-html/domain.com/] rewrite 'guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> 'http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' [perdir /home/neezer/public-html/domain.com/] explicitly forcing redirect with http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [perdir /home/neezer/public-html/domain.com/] escaping http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php for redirect [perdir /home/neezer/public-html/domain.com/] redirect to http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [REDIRECT/301] 

我相信问题在于中间部分(我通过换行符分开)。 在Apache重写到本地path(使用/home/neezer/... )后,它似乎发出了另一个请求,剥离了文档根目录,这当然包括/guide ,然后在第一个规则中过滤,最后过滤第二条规则,来回无限。

我如何告诉它只是在第一条规则之后停止? 添加[L]似乎没有效果。

我不知道你为什么使用RewriteConds。 在我看来,你可以把一切都直接放在RewriteRules中。 看起来你的问题源于你redirect了与Request_URI匹配的所有东西。 如果您在RewriteRule中进行匹配,则重写的规则将不再符合下一条规则。

你可能想尝试像这样的:

 RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301] RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$2 

你可能需要调整这些,因为我不明白你想要完成什么。 例如下面的RewriteCond似乎是redundent,所以我把它排除在外。 如果你真的试图重写指南目录下的所有东西,你将不得不重新整合。

 RewriteCond %{REQUEST_URI} !^/guide/(.*)$ 

编辑
在我的服务器上做了一些快速testing之后,我能够得到这些规则,但不是在每个目录的上下文中(即不在.htaccess中或在<Directory></Directory> )。

我没有testing这个,但是你可以通过设置第二个规则的evironmmentvariables来解决这个问题,然后在第一个testing中进行testing。

 RewriteCond %{ENV:REDIRECT} !^NO$ RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301] RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ [E=REDIRECT:NO] 

我无法find无限循环周围,所以我把文件移动到一个名为“邻居”的新文件夹,并使用这些规则:

 RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L] RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/neighborhoods/$1-apartments/$2 [L] 

不太理想,因为现在我有两个文件夹(我有其他文件我服务的指导),但它确实解决了我的search引擎优化问题。