【问题标题】:SEO URL based on category name without have a category id in URL基于类别名称的 SEO URL,URL 中没有类别 ID
【发布时间】:2012-03-21 17:50:46
【问题描述】:

我有两张桌子posts & categories

post_id | post_title  | post_content   | post_cat
--------------------------------------------------
1         Hello World  welcome to my..   1
.         ..           ..                ..

categories

cat_id | cat_name | cat_parent
-----------------------------
1        News       NULL
2        Sports     1
.        ...        .. 

假设当前新闻的类别链接是http://domain.com/category/1/

MySQL 语句

SELECT posts.post_id,
       posts.post_id,
       posts.post_title,
       posts.post_content,
       posts.post_cat,
       categories.cat_id,
       categories.cat_name,
       categories.cat_parent
FROM   posts
       INNER JOIN categories
         ON posts.post_cat = categories.cat_id  
       WHERE posts.post_cat = (int)$_GET['cat_id']

所以我们可以得到post_cat = 1的结果

根据我当前的数据库结构,如何删除ID 并将其更改为一个不错的 slug?示例:-

Main category - http://domain.com/category/news/
Sub category  - http://domain.com/category/news/sports/

让我知道脚本如何告诉News 等于1post_cat 列上的线索?

【问题讨论】:

  • htaccess 文件可能对您有所帮助。你会想rewrite the URL
  • 我看到您正在投射$_GET 数组中收到的参数 - 好游戏。您应该始终确保您正在清理可能被用户篡改的数据。

标签: php url-rewriting seo


【解决方案1】:

您可以使用.htaccess filerewrite the URL's

.htaccess 文件中的条目看起来像这样:

RewriteEngine on
RewriteCond $1 ^category 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ parseCategoryUrl.php?q=$1 [L,QSA]

我将在这里分解这些行以帮助理解发生了什么以及每行的含义:

  1. 打开重写引擎。
  2. 这种重写只会发生在主机名后面的第一个单词是category 的 URL 上 - 所有以该单词开头的 URL 都将由下面的行处理。
  3. 该规则将排除指向实际文件!-f的URL
  4. 该规则将排除指向实际目录!-d的URL
  5. 实际规则将捕获整个 request_uri 并将其传递给 parseCategoryUrl.php 文件,并将整个请求作为 $_GET 数组中称为 q(查询)的参数。规则末尾的标志 (L,QSA) 做了两件事。
    • L - 这是最后一条规则。处理此行后,.htaccess 文件将停止对当前 URL 执行操作。
    • QSA - 将查询字符串附加到重写后的 URL(以便我们稍后对其进行解析)。

您的parseCategoryUrl.php 文件可能包含类似于以下内容:

$request = explode('/',$_GET['q'] );
array_shift($request);

第一行将通过斜杠将请求拆分为一个数组 - 第二行从数组的开头删除单词类别(因为我们知道我们正在解析一个类别 URL)。

最后的 $request 数组,带有一个 URL 示例,例如: http://example.domain.com/category/news/sports
会是这样的:

Array
(
    [0] => news
    [1] => sports
)

所以您在这里看到您现在已经成功地将 URL 拆分为一个数组;您现在所要做的就是查询您的数据库并为用户提供正确的页面。
因为parseCategoryUrl.php 页面实际上没有输出,所以您可以使用include() 函数根据提供的 URL 插入正确的页面。


SEO 旨在使您的网页及其 URL 向搜索引擎提供更多信息,以便搜索互联网的用户能够接收与其搜索查询相关的网页结果。查看 URL 的搜索引擎: http://domain.com/category/1/2 将无法提取太多信息。但是,如果您的 URL 包含(如您的问题所要求的)类别信息,那么搜索引擎将能够推断出特定 URL 与:

  • http://domain.com/category/news/ - 新闻
  • http://domain.com/category/news/sports - 体育新闻
  • http://domain.com/category/blog/ - 博客
  • 等等……

【讨论】:

  • 谢谢 Lix,一个很好的解决方案 :)
  • 不客气@UnknownError!许多人对使用.htaccess 文件犹豫不决,因为它们具有神秘和黑魔法的性质;)它们实际上是一个非常强大和有用的工具(在右手中)
  • 基本上你没有来删除第一个元素 - 将它放在数组中只是多余的,因为我们已经开始解析类别。编码愉快!
【解决方案2】:

它与生成带有 id 的 url 没有什么不同。使用相同的逻辑生成带有标题的 url。不管他们怎么看,只有一件事,你需要记住。

类别名称必须是唯一的。

放置一个 .htaccess 以确保标题正确地重定向到您的页面

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /category.php?title=$1 [L]

然后,不要在查询中使用id,而是使用title

SELECT posts.post_id,
       posts.post_id,
       posts.post_title,
       posts.post_content,
       posts.post_cat,
       categories.cat_id,
       categories.cat_name,
       categories.cat_parent
FROM   posts
       INNER JOIN categories
         ON posts.post_cat = categories.cat_id  
Where 
      categories.cat_name = 'News'

对于子类别,上面的查询也应该有效,因为所有类别都放在同一个表中。

【讨论】:

  • 看起来我需要在categories 表示例slug 上创建另一列。所以如果类别名称是 slug 将是ask-question 并且在post_cat 列中将是ask-question?
  • @UnknownError,是的,它将删除应用程序工作所需的额外逻辑,并使编码更容易。
  • @Lix,我明白你的意思,而且你确实提出了一个很好的解决方案。现在,没有 SEO 规则,即 http://domain.com/category/news/http://domain.com/news/ 对 SEO 更友好,除非 Web 应用程序需要它。您的技术的唯一优势是,它使应用程序具有可扩展性并且很好。但这不是被要求的,也不是我需要给予的。既然你已经给了。
  • 我的例子是http://domain.com/category/1/ 超过http://domain.com/news/。所以我们在同一条线上。在您编辑后,我删除了我的评论。加上.htaccess,你的答案就完成了:)
猜你喜欢
  • 2017-03-04
  • 2011-08-22
  • 2014-10-08
  • 1970-01-01
  • 2018-04-11
  • 2011-09-04
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多