CakePHP:通过路由器重定向::重定向不保留参数

CakePHP:通过路由器重定向::重定向不保留参数,cakephp,redirect,url-rewriting,url-routing,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/Route/Cake

我试图用以下代码将/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/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

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

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

怎么办?

您是否正确设置了新url的路由

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]”


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

您是否正确设置了新url的路由

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]”

显然,在尝试重定向之前,您需要测试/news/test是否按照预期在路由中工作。

尝试以下代码

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

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


CakePHP中可能有一个bug。升级到当前最新版本v2.3.9就成功了。我问题中的代码确实有效。

CakePHP中可能有一个bug。升级到当前最新版本v2.3.9就成功了。我问题中的代码确实有效。

将“persist”更改为“pass”@kicaj将第一个代码中的persist更改为pass或将第二个代码中的persist更改为pass都会有所帮助。但是现在,这两个代码变体都重定向到/news/view,没有任何参数。您使用的cakephp版本是什么?@user221931我以前使用的是v2.3.7,但是现在更新到了v2.3.9,目前是最新版本,我的第二个代码示例有效:请您在这里提及我的旧url是什么?将“persist”更改为“pass”@kicaj在第一个代码中或在第二个代码中更改persist为pass都没有帮助。但是现在,这两个代码变体都重定向到/news/view,没有任何参数。您使用的是什么cakephp版本?@user221931我以前使用v2.3.7,但现在更新到v2.3.9当前最新版本,我的第二个代码示例可以工作:请您在这里提及我的旧url是什么?/news/test肯定可以工作,重定向是一个不起作用的重定向。但是将CakePHP升级到最新版本就成功了。我上面的代码有效。包含Router::redirect的第二个代码示例无效。见下面我的问题和评论。升级成功了。/news/test确实有效,重定向无效。但是将CakePHP升级到最新版本就成功了。我上面的代码有效。包含Router::redirect的第二个代码示例无效。见下面我的问题和评论。升级成功了。我想重定向,而不是连接路由。我上面的代码在将CakePHP更新到最新版本时起作用。我想重定向,而不是连接路由。我上面的代码在将CakePHP更新到最新版本时起作用。由于2.3.7和2.3.9之间没有影响Router::redirect的任何更改,但Router::connect中有一个条件被放宽了,问题可能是您一开始没有正确设置新路由。@user221931但我没有更改代码中的任何字符。它只是通过升级工作。因此,我认为我在设定路线时没有错误。是的,正是我所说的。您从未正确设置过路由,它失败了。CakePhp决定放松一些严格的检查,以使其工作,即使您没有正确设置。因此,它现在起作用了。@user221931我刚刚编辑了我的问题,以概述新闻路线设置。您认为有错误吗?由于2.3.7和2.3.9之间没有任何变化影响Router::redirect,但Router::connect中有一个条件放松的地方,问题可能是您没有正确设置新路由。@user221931但我没有更改代码中的任何字符。它只是通过升级工作。因此,我认为我在设定路线时没有错误。是的,正是我所说的。您从未正确设置过路由,它失败了。CakePhp决定放松一些严格的检查,以使其工作,即使您没有正确设置。因此,它现在起作用了。@user221931我刚刚编辑了我的问题,以概述新闻路线设置。你认为有错吗?