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

时间:2010-11-19 20:44:54

标签: zend-framework redirect http-status-code-301

我有一大堆旧路由需要重定向到新路由。

我已经在Bootstrap中定义了自定义路由:

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重定向添加将旧路由重定向到新路由的路由?

5 个答案:

答案 0 :(得分:10)

我这样做了

  1. 添加Zend_Route_Regexp路由作为旧路由
  2. 为旧路线添加控制器和操作
  3. 添加逻辑以解析旧路由
  4. 为此逻辑添加$this->_redirect($url, array('code' => 301))

答案 1 :(得分:7)

Zend Framework没有内置这种类型的功能。所以我创建了一个自定义Route对象来处理这个问题:

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);
    }
}

答案 2 :(得分:2)

在控制器中,尝试这种方式:

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

答案 3 :(得分:0)

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

最简单可能只是使用您的.htaccess文件来RewriteRule pattern substitution [R=301]

您还可以检测控制器中使用的路径,并根据该路线重定向:

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

答案 4 :(得分:0)

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

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));
    }
}