您可以使用 ZF 的 Zend_Controller_Router_Route。例如,要制作与 SO 使用的类似 url,可以在 application.ini 中定义自定义路由,如下所示(假设您有控制器和操作分别称为 questions 和 show):
resources.router.routes.questions.route = '/questions/:id/:title'
resources.router.routes.questions.type = "Zend_Controller_Router_Route"
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.defaults.id =
resources.router.routes.questions.defaults.title =
resources.router.routes.questions.reqs.id = "\d+"
有了这样的路由,在你看来你可以生成一个如下的 url:
<?php echo $this->url(array('id'=>621380,'title' => 'seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo+url+structure
//OR if you really want to have dashes in your title:
<?php echo $this->url(array('id'=>621380,'title' => preg_replace('/\s+/','-','seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo-url-structure
请注意,/myapp/public/ 在生成的 url 中,因为我没有在我的 localhost 上设置虚拟主机,也没有对 .htaccess 进行任何修改。另请注意,您不需要拥有唯一的 :title,因为您的真实 id 在 :id 变量中。
附带说明,如果您想让它对用户更加友好,最好将您的网址设为/question/621380/see-url-structure 而不是/questions/621380/see-url-structure。这是因为在这个 url 下你只会有一个问题,而不是很多问题。这可以通过将路由更改为以下resources.router.routes.questions.route = '/question/:id/:title' 来简单地完成。
编辑:
如何处理您的问题中的类别和产品?所以,我会定义一个自定义路由,但这次使用Zend_Controller_Router_Route_Regex:
resources.router.routes.questions.route = '/questions/(\d+)-(d+)/(\w*)'
resources.router.routes.questions.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.map.1 = category
resources.router.routes.questions.map.2 = product
resources.router.routes.questions.map.3 = title
resources.router.routes.questions.reverse = "questions/%d-%d/%s"
然后会生成此路由的 url:
<?php echo $this->url(array('category' => 6213,'product' => 80,'title' => preg_replace('/\s+/', '-', 'seo url structure')),'questions' ); ?>
// results in: /myapp/public/questions/6213-80/seo-url-structure
希望这将有助于或至少为您指明正确的方向。