Zend Framework: как 301 перенаправить старые маршруты на новые пользовательские маршруты? - PullRequest
6 голосов
/ 19 ноября 2010

У меня есть большой список старых маршрутов, которые мне нужно перенаправить на новые маршруты.

Я уже определяю свои собственные маршруты в 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 ]

10 голосов
/ 20 ноября 2010

Я сделал это так

  1. Добавить маршрут Zend_Route_Regexp в качестве старого маршрута
  2. Добавить контроллер и действие для старого маршрута
  3. Добавить логику для разбора старого маршрута
  4. Добавить $this->_redirect($url, array('code' => 301)) для этой логики
7 голосов
/ 10 июля 2012

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 голосов
/ 16 апреля 2013

В контроллере попробуйте так:

     $this->getHelper('redirector')->setCode(301);
     $this->_redirect(...);
0 голосов
/ 10 июля 2012

Я использовал это для перенаправления на контроллер, который обрабатывал только перенаправления. Теперь я использую пользовательский класс, упомянутый в моем другом ответе.

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));
    }
}
0 голосов
/ 20 ноября 2010

Существует несколько подходов к решению этой проблемы.

Самый простой - это, вероятно, просто использование файла .htaccess для создания RewriteRule pattern substitution [R=301]

Вы также можете определить, какой маршрут использовался в контроллере, и перенаправить на основании этого:

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