Zend Framework:如何将旧路由重定向到新的自定义路由?
问题描述:
我有一大堆我需要重定向到新路线的旧路线。Zend Framework:如何将旧路由重定向到新的自定义路由?
我已经定义我的自定义路线的引导:
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重定向到新航线的老航路?
答
Zend框架没有这种类型的内置功能。所以,我创建为了处理一个自定义路由对象是:
: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);
}
}
答
有几种方法可以解决这个问题。
的最简单可能是只使用你的.htaccess
文件做一个RewriteRule pattern substitution [R=301]
你也可以检测控制器使用什么途径和重定向依据是:
public function preDispatch() {
$router = $this->getFrontController()->getRouter();
if ($router->getCurrentRouteName() != 'default') {
return $this->_redirect($url, array('code'=>301));
}
}
答
我像这样做
- 添加Zend_Route_Regexp路线作为旧路线
- 添加控制器和行动的老路
- 添加逻辑来解析老路
- 添加
$this->_redirect($url, array('code' => 301))
这个逻辑
+0
我想这就是我要做的。谢谢! – Andrew 2010-11-19 22:25:53
答
我用来做到这一点的方式是重定向到只处理重定向的控制器。现在我使用我的其他答案中提到的自定义类。
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));
}
}
答
在控制器,试试这个方法:
$this->getHelper('redirector')->setCode(301);
$this->_redirect(...);
为什么发送301没有做重定向是什么时候?从我所看到的只是将旧路线映射到新路线而不重定向? – Fge 2010-11-19 20:49:59
对不起,不好的例子。我正在尝试重定向,而不是路由。 – Andrew 2010-11-19 20:51:54
我已更新示例以更清晰 – Andrew 2010-11-19 20:54:13