CakePHP:通过Router :: redirect重定向不保留params

时间:2013-07-24 19:24:37

标签: cakephp redirect url-rewriting url-routing

我正在尝试使用以下代码将/my-old-url/$slug重定向到CakePHP中的/news/$slug

Router::redirect(
    '/my-old-url/*',
    array('controller' => 'news', 'action' => 'view'),
    array('persist' => true)
);

使用此代码会引发错误(可能是错误?)

  

警告(2):为foreach()提供的参数无效[CORE / Cake / Routing / Route / CakeRoute.php,第381行]

public function persistParams($url, $params) {
    foreach ($this->options['persist'] as $persistKey) {

即使尝试以下代码也不起作用:

Router::redirect(
    '/my-old-url/:slug',
    array('controller' => 'news', 'action' => 'view'),
    array('persist' => array('slug'))
);

此代码将我重定向到/news/view,没有任何参数。

我使用以下代码连接新闻网址:

Router::connect('/news',
    array('controller' => 'news', 'action' => 'index')
);
Router::connect('/news/:slug',
    array('controller' => 'news', 'action' => 'view'),
    array('pass' => array('slug'))
);

怎么办?

3 个答案:

答案 0 :(得分:0)

您是否正确设置了新网址的路由?

Router::connect(
    '/news/:slug',
    array('controller' => 'news', 'action' => 'view'),
    array('pass' => array('slug'), 'slug' => '[\w]')
);

然后让它用

进行重定向
Router::redirect(
    '/old-url/:slug',
    array('controller' => 'news', 'action' => 'view'),
    array('persistent' => true, 'pass' => array('slug'))
);

我不认为您需要在重定向中再次定义slug([\w]),但如果它不起作用,请尝试'slug' => '[\w]'之后的'pass'

显然,在尝试重定向之前,您需要测试/news/test是否与路由一起正常工作。

答案 1 :(得分:0)

尝试以下代码

Router::connect('/my-old-url/*', array('controller' => 'News','action' => 'view'),array('params' => '[a-zA-Z0-9]+'));

答案 2 :(得分:-1)

CakePHP中可能存在错误。升级到最新版本(目前为v2.3.9)就可以了。我的问题中的代码确实有用。