2010-11-19 11 views
6

Mam dużą listę starych tras, które muszę przekierować na nowe trasy.Zend Framework: Jak 301 przekierować stare trasy na nowe niestandardowe trasy?

Mam już moje definiowania niestandardowych tras w 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') 
    )); 
} 

Jak mogę dodać trasy, które przekierowują stare trasy przy użyciu 301 przekierowanie do nowych tras?

+0

Dlaczego wysyłanie 301 robiąc żadnej przekierowanie? Z tego co widzę, po prostu mapujesz stare trasy na nowe bez przekierowania? – Fge

+0

Przepraszam, zły przykład. Próbuję przekierować, a nie routować. – Andrew

+0

Zaktualizowałem przykład, aby być bardziej zrozumiałym. – Andrew

Odpowiedz

7

Zend Framework nie ma tego typu funkcji wbudowanych w. Więc stworzyli Trasa obiekt niestandardowy, aby sobie z tym poradzić:

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

Następnie można go używać podczas definiowania tras:

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

Istnieje kilka sposobów rozwiązania tego problemu.

najprostszy to chyba po prostu użyć pliku .htaccess zrobić RewriteRule pattern substitution [R=301]

Można również wykryć co trasa została wykorzystana w kontrolerze i przekierować na podstawie, że:

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

I zrobiliśmy to w ten sposób

  1. Dodaj trasę Zend_Route_Regexp jako starą trasę
  2. Dodaj kontrolera i akcji na starym szlaku
  3. dodawania logicznego analizowania starym szlaku
  4. Dodaj $this->_redirect($url, array('code' => 301)) dla tej logiki
+0

Myślę, że to właśnie zrobię. Dzięki! – Andrew

0

Sposób, w jaki to robiłem, polegał na przekierowaniu do kontrolera, który przetwarzał tylko przekierowania. Teraz używam klasy niestandardowej wymienionej w mojej drugiej odpowiedzi.

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

i kontroler:

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

W kontrolerze, spróbuj w ten sposób:

 $this->getHelper('redirector')->setCode(301); 
    $this->_redirect(...); 
Powiązane problemy