我正在定义正则表达式路由来清理我的URL。这个想法是,用户添加的所有页面都将使用URL www.example.com/page-slug,而不是使用实际的控制器,www.example.com/userpages/page-slug。其他页面将遵循标准模块:控制器:操作路由方案。
我正在尝试使用路由器优先级来解决这个问题。
我在下面定义了方案。
class Default_Bootstrap extends Zend_Application_Module_Bootstrap{
protected function _initRoute() {
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter(); // returns a rewrite router by default
$route['index'] = new Zend_Controller_Router_Route_Regex(
'/',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index'
)
);
$route['contact'] = new Zend_Controller_Router_Route_Regex(
'contact/(d+)',
array(
'module' => 'default',
'controller' => 'contact',
'action' => 'index'
)
);
$route['research'] = new Zend_Controller_Router_Route_Regex(
'research/(d+)',
array(
'module' => 'default',
'controller' => 'research',
'action' => 'index'
)
);
$route['account'] = new Zend_Controller_Router_Route_Regex(
'account/(d+)',
array(
'module' => 'default',
'controller' => 'account',
'action' => 'index'
)
);
$route['userpages'] = new Zend_Controller_Router_Route_Regex(
'/(.+)',
array(
'module' => 'default',
'controller' => 'userpages',
'action' => 'index'
),
array(
'slug' => 1
),
'%s'
);
$router->addRoute('userpages', $route['userpages']);
$router->addRoute('contact', $route['contact']);
$router->addRoute('research', $route['research']);
$router->addRoute('account', $route['account']);
$router->addRoute('index', $route['index']);
}
}
路由器优先级通常工作正常,确保索引/帐户/研究/联系页面选择正确的控制器。但是,当尝试转到"用户页面"路由(例如"关于我们"(覆盖的 URL 时,找不到最终捕获所有路由,从而导致......
Message: Invalid controller specified (about-us)
.
.
.
Request Parameters:
array (
'controller' => 'about-us',
'action' => 'index',
'module' => 'default',
)
知道我在这里出错的地方吗?在我看来,正则表达式是正确的"/(.+("应该捕获不是索引页的内容。
编辑:@phatfingers,好吧,你是对的,我已经将"\d+"编辑为".+"以捕获任何字符的一个或多个。问题仍然存在。实际上,在更改正则表达式之前,我尝试了URL www.example.com/52,并得到了相同的错误-"指定的控制器无效(52("。更改后 - 使用上面编辑的代码段的代码,规则仍然无法找到任何匹配项。
在"用户页面"正则表达式中删除正斜杠,即只是 ('.+(
报价直接来自手动Zend Router和Router_Regex但afaik它也适用于所有路由。
注意:前导和尾随斜杠是从 URL 中修剪的 比赛前的路由器。因此,匹配 URL http://domain.com/foo/bar/,将涉及 foo/bar 的正则表达式,而不是 /foo/bar.