我正在尝试实现规范网址并将其与自定义路由类结合使用。
URL方案是这样的:
/category-x/article/123
/category-y/article/123
我创建了一个扩展Zend_Controller_Router_Route_Regex
的自定义路由类,并检查文章123是否存在以及该URL是否包含正确的类别名称。如果文章123属于category-x且用户正在访问category-y,我想重定向到正确的URL。
但是这些路线没有任何明显的可能性直接这样做。这里最好的做法是什么?
答案 0 :(得分:0)
我经常在动作控制器中执行此操作。像这样......
// assuming GET /category-y/article/123
// $article->url is generated, and contains /category-x/article/123
if (this->_request->getRequestUri() != $article->url) {
return $this->_helper->redirector->goToUrl($article->url);
}
在此示例中,需要从数据库数据生成$ article-> url。当我同时拉入对象id时,我经常使用它来验证正确的slu。
如果你想使用自定义的一个而不是使用Regex(你可以将它子类化),你也可以将它移到路由类中。
答案 1 :(得分:0)
我最终得到了这个解决方案:
自定义路由类在其match()中创建规范URL - 方法如下:
public function match($path, $partial = false) {
$match = parent::match($path, $partial);
if (!empty($match)) {
$article = $this->backend->getArticle($match['articleId']);
if (!$article) {
throw new Zend_Controller_Router_Exception('Article does not exist', 404);
}
$match['canonicalUrl'] = $this->assemble(array(
'title' => $article->getTitle(),
'articleId' => $article->getId()
));
}
return $match;
}
如果parent :: match()返回数组,则在match()中填充$ article。 我创建了一个前端控制器插件,它挂在routeShutdown()上,如下所示:
public function routeShutdown(Zend_Controller_Request_Abstract $request) {
if ($request->has('canonicalUrl')){
$canonicalUrl = $request->getBaseUrl() . '/' . $request->get('canonicalUrl');
if ($canonicalUrl != $request->getRequestUri()) {
$this->getResponse()->setRedirect($canonicalUrl, 301);
}
}
}
它只是检查路由(自定义或本机Zend)是否创建了规范URL,如果请求的URL不匹配,则重定向到正确的规范URL。