2010-11-19 7 views
6

Ich habe eine große Liste von alten Routen, die ich auf neue Routen umleiten muss.Zend Framework: Wie 301 alte Routen auf neue benutzerdefinierte Routen umleiten?

Ich bin die Definition bereits meine eigene Routen im 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') 
    )); 
} 

Wie kann ich Routen hinzufügen, die die alten Routen umleiten mit einer 301 auf die neuen Routen umleiten?

+0

Warum 301 sendet, wenn keine Umleitung zu tun? Von dem, was ich sehe, machst du nur die alten Routen zu den neuen ohne Umleitung? – Fge

+0

Entschuldigung, schlechtes Beispiel. Ich versuche umzuleiten, nicht zu routen. – Andrew

+0

Ich habe das Beispiel aktualisiert, um klarer zu sein – Andrew

Antwort

7

Zend Framework nicht diese Art von Funktionalität hat gebaut zu analysieren. So habe ich erstellt eine individuelle Routen Objekt, um das zu handhaben:

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

Dann können Sie es verwenden, wenn Sie Ihre Routen zu definieren:

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

Es gibt einige Ansätze, um dieses Problem zu lösen.

Die einfachste ist wahrscheinlich nur auf Ihre .htaccess Datei verwenden eine tun RewriteRule pattern substitution [R=301]

Sie können auch erkennen, welche Route in der Steuerung verwendet wurde und Redirect auf dieser Basis:

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

I‘ habe es wie diese

getan
  1. eine Zend_Route_Regexp Route als die alte Route hinzufügen
  2. hinzufügen Controller und die Aktion für die alte Route
  3. Add Logik alte Route in
  4. hinzufügen $this->_redirect($url, array('code' => 301)) für diese Logik
+0

Ich denke, das werde ich tun. Vielen Dank! – Andrew

0

Die Art, wie ich es getan habe, war die Umleitung zu einem Controller, der nur Umleitungen behandelte. Jetzt verwende ich die benutzerdefinierte Klasse, die in meiner anderen Antwort erwähnt wird.

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

Und der Controller:

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

In Controller, versuchen auf diese Weise:

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