由于我还没有找到使用 Router::redirect() 的方法,所以我保留了原始路由:
Router::connect("/:category/:product-name/*", 
    array(
        'controller' => 'products', 'action' => 'view'
    ), 
    array(
        'routeClass' => 'CategoryRouteClass', 
        'pass' => array('category', 'product-name')
    )
);
并添加新路由以匹配新 URL,指向相同的方法和相同的控制器,但添加新的路由元素并将其作为方法参数传递:
Router::connect("/:store-section/:category/:product-name/*", 
    array(
        'controller' => 'products', 'action' => 'view'
    ), 
    array(
        'routeClass' => 'CategoryRouteClass', 
        'pass' => array('category', 'product-name', 'store-section')
    )
);
...然后在产品控制器的视图方法中,我检查是否设置了 store-section 参数,如果不是,我发出重定向,将默认 store-section 添加到当前 URL,如下所示:
Class ProductsController extends AppController {
    public function view($category= null, $product-name = null, 
        $store-section = null) {
        if (empty($store-section)) {
            $this->redirect(array(
                'controller' => 'products', 'action' => 'view', 
                'category' => $category,
                'product-name' => $product-name, 
                'store-section' => 'default-section'), '301');
        }
        //.................
    }
}
这成功地将旧产品 url 发出 301 到新产品,这对于 SEO 和保持旧的入站链接在 Cakephp 中工作很有用。