Zend Framework:如何将旧路由重定向到新的自定义路由?

问题描述:

我有一大堆我需要重定向到新路线的旧路线。Zend Framework:如何将旧路由重定向到新的自定义路由?

我已经定义我的自定义路线的引导:

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 

    $oldRoute = 'old/route.html'; 
    $newRoute = 'new/route/*'; 

    //how do I add a 301 redirect to the new route? 

    $router->addRoute('new_route', 
     new Zend_Controller_Router_Route($newRoute, 
      array('controller' =>'fancy', 'action' => 'route') 
    )); 
} 

如何添加重定向使用301重定向到新航线的老航路?

+0

为什么发送301没有做重定向是什么时候?从我所看到的只是将旧路线映射到新路线而不重定向? – Fge 2010-11-19 20:49:59

+0

对不起,不好的例子。我正在尝试重定向,而不是路由。 – Andrew 2010-11-19 20:51:54

+0

我已更新示例以更清晰 – Andrew 2010-11-19 20:54:13

Zend框架没有这种类型的内置功能。所以,我创建为了处理一个自定义路由对象是:

class Zend_Controller_Router_Route_Redirect extends Zend_Controller_Router_Route 
{ 
    public function match($path, $partial = false) 
    { 
     if ($route = parent::match($path, $partial)) { 
      $helper = new Zend_Controller_Action_Helper_Redirector(); 
      $helper->setCode(301); 
      $helper->gotoRoute($route); 
     } 
    } 
} 

然后,你可以定义你的路由时使用

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initCustomRoutes() 
    { 
     $router = Zend_Controller_Front::getInstance()->getRouter(); 
     $route = new Zend_Controller_Router_Route_Redirect('old/route/*', array('controller'=>'content', 'action'=>'index'));  
     $router->addRoute('old_route', $route); 
    } 
} 

有几种方法可以解决这个问题。

最简单可能是只使用你的.htaccess文件做一个RewriteRule pattern substitution [R=301]

你也可以检测控制器使用什么途径和重定向依据是:

public function preDispatch() { 
    $router = $this->getFrontController()->getRouter(); 
    if ($router->getCurrentRouteName() != 'default') { 
    return $this->_redirect($url, array('code'=>301)); 
    } 
} 

我像这样做

  1. 添加Zend_Route_Regexp路线作为旧路线
  2. 添加控制器和行动的老路
  3. 添加逻辑来解析老路
  4. 添加$this->_redirect($url, array('code' => 301))这个逻辑
+0

我想这就是我要做的。谢谢! – Andrew 2010-11-19 22:25:53

我用来做到这一点的方式是重定向到只处理重定向的控制器。现在我使用我的其他答案中提到的自定义类。

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initRoutes() 
    { 
     $router = Zend_Controller_Front::getInstance()->getRouter(); 

     //new routes 
     $router->addRoute('myroute', 
      new Zend_Controller_Router_Route_Static('/new/route/1234', 
       array('controller' =>'brands', 'action' => 'view', 'id' => '4') 
     )); 

     //old routes 
     $oldRoutes = array(
      '/old/route/number/1' => '/new/route/1234', 
     } 
     foreach ($oldRoutes as $oldRoute => $newRoute) { 
      $router->addRoute($oldRoute, new Zend_Controller_Router_Route_Static($oldRoute, array('controller' =>'old-routes', 'action' => 'redirect', 'new-route' => $newRoute))); 
     } 
    } 
} 

而且控制器:

class OldRoutesController extends Zend_Controller_Action 
{  
    public function redirectAction() 
    { 
     $newRoute = $this->_getParam('new-route'); 
     return $this->_redirect($newRoute, array('code' => 301)); 
    } 
} 

在控制器,试试这个方法:

 $this->getHelper('redirector')->setCode(301); 
    $this->_redirect(...);