我有这样的网址:
http://quickstart.local/public/category1/product2
并且在url(category1 / product2)中的数字是从数据库注意到id的id,categories和products
id是唯一的
我需要像zend框架网址这样的敏感网址。例如:http://stackoverflow.com/questions/621380/seo-url-structure
我如何将该网址转换为新的网址
有什么办法吗?!!
答案 0 :(得分:2)
您需要在数据库中使用字段名称(例如“url”或类似名称)存储唯一值。每次生成新产品时,您都必须创建此唯一URL并将其与产品信息一起存储。一种常见的方法是获取产品的名称并使其成为友好的网址:
public function generateUrl($name)
{
$alias = str_replace(' ', '-', strtolower(trim($name)));
return preg_replace('/[^A-Za-z0-9-]/', '', $alias);
}
调用此方法:
$url = $this->generateUrl("My amazing product!");
echo $url;
将输出:
MY-惊人副产物
您需要检查数据库中是否存在此函数的输出,因为您将使用此值来查询而不是id。
如果您也将此逻辑应用于类别,则可以使用下面的简单易读和描述性网址。在此之前,您可能需要调整路由。
http://quickstart.local/public/awesome-stuff/my-amazing-product
答案 1 :(得分:1)
你可以使用ZF的Zend_Controller_Router_Route。例如,要使用与SO使用的URL相似的URL,可以在application.ini中定义一个自定义路由,如下所示(假设你有控制器和动作分别称为问题和显示):
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+"
有了这样的路线,您可以在视图中生成如下网址:
<?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
变量中。
作为旁注,如果您想让它更加用户友好,那么最好将您的网址设为/question/621380/see-url-structure
而不是/questions/621380/see-url-structure
。这是因为在这个网址下你只有一个问题,而不是很多问题。这可以通过将路由更改为以下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"
然后会生成此路线的网址:
<?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
希望这有助于或至少指出正确的方向。