我有这个规则:
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引擎优化问题。