从URL中删除模式,301重定向到新URL

时间:2013-07-01 00:46:03

标签: .htaccess cakephp redirect routes rewrite

假设以下内容:

mywebsite.com/searches/index/page:x  where x is an integer.

我想删除索引/并重定向到

mywebsite.com/searches/page:x

我的Web应用程序基于CakePHP,我将以下行添加到webroot目录中的.htaccess文件中,但它没有得到任何结果。

RewriteRule ^(.*)/searches/index/(.*)$ searches/$1 [R=301,L]

我需要知道我应该使用正确的.htaccess代码。

然而,我问了这个问题,因为谷歌网站管理员工具告诉我有很多软401错误。在我的应用程序路由中,我省略了在routes.php中的以下行调用索引页:

 Router::connect('/searches/index/*', array('controller' => 'error','action'=>'e404'));
Router::connect('/searches', array('controller' => 'searches', 'action' => 'index','page' => 1)); 
Router::connect('/searches/*', array('controller' => 'searches', 'action' => 'index')); 

因此,如果有另一种解决方案可以解决CakePHP中的Google问题,我将不胜感激。

我的蛋糕版本是1.2.11。

1 个答案:

答案 0 :(得分:1)

规则开头的组将使规则匹配mywebsite.com/searches/index/page:x之类的URI以及mywebsite.com/foobar/searches/index/page:x之类的URI。它看起来不像你想要的那样。

此外,您正在使用backreference作为替换模式中的第一个组,这会导致新网址永远不会包含page:x部分。相反,它会重定向至mywebsite.com/searches以获取mywebsite.com/searches/index/page:x之类的URI,并重定向至mywebsite.com/searches/foobar以获取类似mywebsite.com/foobar/searches/index/page:x的URI。

我认为你的规则应该更像这样:

RewriteRule ^/?searches/index/(.*)$ /searches/$1 [R=301,L]

请注意,除了删除第一个组之外,我还在模式中选择了前导斜杠,因为它是forbidden with Apache 2.x, while it's necessary with Apache 1.x,并且我在替换部分中添加了一个前导斜杠以确保它将重定向到根。