cakephp路由器重定向使用路由元素

时间:2013-09-09 19:42:01

标签: cakephp redirect mod-rewrite url-routing

我在我的网站中更改了链接的结构,添加了新的路由元素,我想重定向旧链接,为新路由元素添加默认值。

,就像之前的网址一样:mysite.com/category/product-name/

我改为看起来像这样:mysite.com/store-section/category/product-name/

我希望旧链接重定向到新链接,为它们添加默认的store-section元素。我想我无法使用mod_rewrite实现这一点,因为使用自定义routeClass从数据库中解析类别。

是否可以使用Router::redirect()中的路径元素来实现此目的?

1 个答案:

答案 0 :(得分:0)

由于我没有找到使用Router :: redirect()的方法,我保留了mi原始路径:

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参数, 如果不是,我发出重定向将默认商店部分添加到当前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');
        }

        //.................
    }
}

这成功地为旧产品发布301新的URL,对SEO有用,并保持旧的入站链接在Cakephp中工作。