2010-11-19 10 views
6

Ho una lunga lista di vecchi percorsi che devo reindirizzare a nuovi percorsi.Zend Framework: come reindirizzare i vecchi percorsi a nuovi percorsi personalizzati?

Sono già definisco i miei percorsi personalizzati nella 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') 
    )); 
} 

Come posso aggiungere percorsi che reindirizzano i vecchi percorsi utilizzando un reindirizzamento 301 per le nuove rotte?

+0

Perché l'invio di 301 quando si fa alcun redirect? Da quello che posso vedere basta mappare i vecchi percorsi a quelli nuovi senza reindirizzare? – Fge

+0

scusa, cattivo esempio. Sto cercando di reindirizzare, non di instradare. – Andrew

+0

Ho aggiornato l'esempio per essere più chiaro – Andrew

risposta

7

Zend Framework non ha questo tipo di funzionalità incorporata. Così ho creato un oggetto percorso personalizzato, al fine di gestire questo:

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

Poi lo si può utilizzare al momento di definire i percorsi:

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

Ci sono alcuni approcci per risolvere questo problema.

Il più semplice è probabilmente quella di utilizzare solo il file .htaccess di fare un RewriteRule pattern substitution [R=301]

Si potrebbe anche rilevare quale percorso è stato utilizzato nel controllore e reindirizzare basa su quanto segue:

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

I' Ho fatto così

  1. Aggiungere un itinerario Zend_Route_Regexp come il vecchio itinerario
  2. Aggiungi controller e l'azione per il vecchio percorso
  3. aggiungere la logica per analizzare percorso vecchio
  4. Aggiungi $this->_redirect($url, array('code' => 301)) per questa logica
+0

Penso che sia quello che farò. Grazie! – Andrew

0

Il modo in cui lo facevo era reindirizzare a un controller che gestiva solo i reindirizzamenti. Ora uso la classe personalizzata menzionata nella mia altra risposta.

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

E il controllore:

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

Nel controllore, provare in questo modo:

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