Zend Framework重写URL到SEO友好URL

时间:2012-09-13 11:49:46

标签: php zend-framework url-rewriting

使用Zend Framework,我正在尝试构建一个SEO友好URL的URL

http://ww.website.com/public/index/categories/category/2
应该由http://ww.website.com/public/index/categories/category.html

映射

http://ww.website.com/public/index/products/category/2/subcategory/2
应该由http://ww.website.com/public/index/products/product.html

映射

在我的Bootstrap文件中,我尝试了这个

protected function _initRoutes()
{ 
    $frontController = Zend_Controller_Front::getInstance ();
    $router = $frontController->getRouter ();
    $route = new Zend_Controller_Router_Route_Regex(
        'index/categories/category/(\d*)/',
        array('module' => 'default','controller' => 'index','action' => 'categories'), 
        array(1 => 'category'),
        'index/categories/%d-%s.html');

    $router->addRoute('category', $route);
}

现在我的问题是如何重写此网址?我还使用以下网址基于URL中的ID检索产品或类别:

$id = $this->_getParam('category', 0 ); 

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

我认为您不需要Regex路线来满足您的需求。 如果你想要这个例子这个网址: 转到http://mysite.com/category/cars.html http://mysite.com/categories/category/id/2就足以使用Zend_Controller_Router_Route

现在只有一个问题Zend Router不会知道要映射的类别的id,为此你需要将自定义路由存储到数据库或文件中;每个自定义路由都将包含映射和所需参数的URL(控制器名称,操作名称,类别ID)。

在我们完成之后,我们可以构建一个函数,将自定义路由注册到bootstrap文件,或者在这样的插件中:

public function setRoute($params){
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $params = array(
        'controller' => $params['controller'],
        'action'     => $params['action'],
        'id'         => $params['id']
        );
    $route = new Zend_Controller_Router_Route($params['url'], $params);
    $router->addRoute($params['url'], $route);
}

现在假设$params['url']有值:http://mysite.com/category/cars.html当从浏览器请求网址ZF将匹配我们的自定义路由并转发请求到$params['controller']中的指定控制器时,并调用指定的操作在$params['action']中,将设置为$params['id']中名为id的参数,可以使用$id = $this->_getParam('id',0);

从控制器中检索

答案 1 :(得分:1)

我认为你选择了错误的路径因为SEO友好并不意味着.html或.php如果你的产品名称在基本网址之后开始喜欢“http://www.promotepassion.com/classical/rock”意味着基本路径然后类别名称然后产品名称,如果我们然后使用所有搜索引擎快速调用页面。