由于我还没有找到使用 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 中工作很有用。