我在routes.ini文件中遵循以下两条规则
routes.frontcms.type = "Zend_Controller_Router_Route_Regex"
routes.frontcms.route = "/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"
routes.frontcms.defaults.module = frontManagement
routes.frontcms.defaults.controller = Front
routes.frontcms.defaults.action = cmspages
routes.frontcms.map.locale = 1
routes.frontcms.map.page = 2
routes.frontcms.map.subpage = 3
routes.frontcms.map.num = 4
routes.frontnoncms.type = "Zend_Controller_Router_Route_Regex"
routes.frontnoncms.route = "/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"
routes.frontnoncms.defaults.module = frontManagement
routes.frontnoncms.defaults.controller = Front
routes.frontnoncms.map.action = 2
routes.frontnoncms.map.locale = 1
routes.frontnoncms.map.page = 2
当我执行此网址时http://zf-cms.local/en/contactus 我得到以下结果。这是预料之中的。它执行了第二条规则
Array ( [locale] => en [action] => contactus [module] => frontManagement [controller] => Front )
当我执行此网址时http://zf-cms.local/en/privacy_policy 以下是结果
Array ( [locale] => en [action] => [3] => privacy_policy [module] => frontManagement [controller] => Front )
它应该执行第一条规则。但由于冲突,它无法决定执行哪一个。 是否有任何可能性我们可以定义第一个检查第二个规则的顺序,如果它没有被检查,则检查第二个。某种优先顺序或订单?
任何一个人面临同样的问题?
答案 0 :(得分:4)
以相反的顺序检查路线,以便它已按您希望的方式工作。您的问题是http://zf-cms.local/en/privacy_policy与第二条路由中的正则表达式匹配,因此路由器不需要检查其他任何内容。
供参考,这是你的模式:
"/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"
因此,如果我们将其分解为位,则路径/en/privacy_policy
的匹配方式如下:
([a-z]{2}+)/? -> matches en/
(newsletter|contactus|accessability|search)?/? -> optional, so is skipped
([a-zA-Z0-9_-]+)?/? -> matches privacy_policy
([a-zA-Z0-9_-]+)? -> optional, so is skipped
取决于您的网址的结构,最简单的解决方案可能是通过删除?来使第二部分非可选的?在它之后:
"/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"