2010-11-19 14 views
6

Tengo una larga lista de rutas antiguas que debo redirigir a nuevas rutas.Zend Framework: ¿cómo 301 redirigir rutas antiguas a nuevas rutas personalizadas?

yo ya estoy definiendo mis rutas personalizadas en el 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') 
    )); 
} 

¿Cómo añadir rutas que redirigen las antiguas rutas que utilizan un redireccionamiento 301 a las nuevas rutas?

+0

Por qué el envío de 301 cuando se hace ninguna redirección? Por lo que puedo ver, ¿simplemente trazas las rutas antiguas a las nuevas sin redirigir? – Fge

+0

lo siento, mal ejemplo. Estoy intentando redirigir, no enrutar. – Andrew

+0

He actualizado el ejemplo para que sea más claro – Andrew

Respuesta

7

Zend Framework no tiene este tipo de funcionalidades incorporadas. Así que he creado un objeto de ruta personalizada con el fin de manejar esto:

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

a continuación, se puede utilizar la hora de definir sus rutas:

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

Existen algunos enfoques para resolver este problema.

El más fácil es probable que sólo tiene que utilizar su archivo .htaccess hacer un RewriteRule pattern substitution [R=301]

También puede detectar qué ruta se utilizó en el controlador y redirigir basa en que:

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

I' lo he hecho así

  1. Agregue una ruta Zend_Route_Regexp como la ruta anterior
  2. Agregar controlador y la acción de la ruta antigua
  3. añadir lógica para analizar antigua ruta
  4. Añadir $this->_redirect($url, array('code' => 301)) de esta lógica
+0

Creo que eso es lo que haré. ¡Gracias! – Andrew

0

La forma en que solía hacerlo era redirigir a un controlador que solo manejaba los redireccionamientos. Ahora uso la clase personalizada mencionada en mi otra respuesta.

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

y el controlador:

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

En el controlador, tratan de esta manera:

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