【问题标题】:Make SEO sensitive URL (avoid id) Zend framework制作 SEO 敏感 URL(避免 id) Zend 框架
【发布时间】:2011-03-27 18:08:20
【问题描述】:

我有这样的网址:

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

在 url (category1/product2) 中,数字是 id ,从数据库中获取的类别和产品注意 id

id 是唯一的

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

我怎样才能像这样将该网址转换为新网址

有什么办法吗?!!

【问题讨论】:

  • 只是一个注释 - 产品 url(用于 eshop)不应包含类别,因为它可以更改,然后它要么没有任何意义,要么更改 url,从而破坏任何反向链接;)

标签: php zend-framework url seo


【解决方案1】:

您需要在数据库中存储一个唯一值,其字段名称为“url”或类似名称。每次生成新产品时,您都必须创建这个唯一的 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;

将输出:

我的神奇产品

您需要检查此函数的输出是否已存在于数据库中,因为您将使用此值而不是 id 进行查询。

如果您也将此逻辑应用于类别,您可以拥有易于阅读和描述性的网址,如下所示。不过,您可能需要调整路由才能正常工作。

http://quickstart.local/public/awesome-stuff/my-amazing-product

【讨论】:

    【解决方案2】:

    您可以使用 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
    

    希望这将有助于或至少为您指明正确的方向。

    【讨论】:

    • @afsane。一个原因可能是 urlencode 函数。 url helper 正在使用它来编码您的字符串。您可以通过将 last url helper 的参数设置为 false 来关闭它,例如$this-&gt;url(array('category' =&gt; 6213,'product' =&gt; 80,'title' =&gt; preg_replace('/\s+/', '-', 'seo url structure')),'questions', false, false); 第三个参数默认为false,第四个参数默认为true。也许这会有所帮助。
    • 这个答案非常好,非常感谢。但我有一个问题,当标题显示字符转换为未知字符时,保存在 db 中的 %231607%3B%26%231608%3B%26%23157 语言是带有 utf8 的波斯语。当我只使用 echo 函数时,一切都很好,但是当我使用 $this->url 函数时,字符有概率
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2020-03-30
    相关资源
    最近更新 更多