CakePHP在重定向后从URL中删除“?url =”

时间:2011-07-21 10:00:17

标签: .htaccess cakephp url-rewriting

我正在使用CakePHP作为我的PHP应用程序。

默认情况下,它会将其放入.htaccess文件中:

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

遵循这条规则,我这样做:

RedirectMatch ^/resources(.*)$ http://domain.com/community$1 [QSA,R=permanent,L]

这会重定向网址:

http://domain.com/community/view/171/?url=resources/view/171/

如何在不破坏cakephp路由的情况下摆脱附加的“?URL =”?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您希望/community/*请求路由到ResourcesController。您应该可以通过将以下内容添加到app/config/routes.php

来实现此目的
/**
 * Rename /resources/* to /community/*
 */
Router::connect('/community', array('controller' => 'resources'));
Router::connect('/community/:action/*', array('controller' => 'resources'));

第二条规则完成了大部分魔术,将匹配请求映射到ResourcesController并传入操作。

通过上述方法,您还可以利用反向路由:

echo $this->Html->link('View community', array(
    'controller' => 'resources',
    'action' => 'view',
    $id
));
// outputs a link to `/community/view/171`

第一条规则就是将动作名称保留在根URL之外(即,反向路由的HtmlHelper链接变为/community而不是/community/index。 / p>


跟进LazyOne的评论,如果您还希望重定向旧的/resources* - 样式链接以进行搜索引擎优化,以下应该可以解决问题:

# app/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/resources(.*)$ /community$1 [R=301,L] # permanent redirect
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>