我有一大堆旧路由需要重定向到新路由。
我已经在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重定向添加将旧路由重定向到新路由的路由?
答案 0 :(得分:10)
我这样做了
$this->_redirect($url, array('code' => 301))
答案 1 :(得分:7)
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 :(得分:2)
在控制器中,尝试这种方式:
$this->getHelper('redirector')->setCode(301);
$this->_redirect(...);
答案 3 :(得分:0)
有几种方法可以解决这个问题。
最简单可能只是使用您的.htaccess
文件来RewriteRule pattern substitution [R=301]
您还可以检测控制器中使用的路径,并根据该路线重定向:
public function preDispatch() {
$router = $this->getFrontController()->getRouter();
if ($router->getCurrentRouteName() != 'default') {
return $this->_redirect($url, array('code'=>301));
}
}
答案 4 :(得分:0)
我以前的方式是重定向到只处理重定向的控制器。现在我使用我在其他答案中提到的自定义类。
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));
}
}