制作SEO敏感URL(避免id)Zend框架

时间:2011-03-27 18:08:21

标签: php zend-framework url seo

我有这样的网址:

http://quickstart.local/public/category1/product2

并且在url(category1 / product2)中的数字是从数据库注意到id的id,categories和products

id是唯一的

我需要像zend框架网址这样的敏感网址。例如:http://stackoverflow.com/questions/621380/seo-url-structure

我如何将该网址转换为新的网址

有什么办法吗?!!

2 个答案:

答案 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

希望这有助于或至少指出正确的方向。