基于类别名称的SEO URL,URL中没有类别ID

时间:2012-03-03 13:51:46

标签: php url-rewriting seo

我有两张桌子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 statment

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相等?

2 个答案:

答案 0 :(得分:6)

您可以使用.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. 打开RewriteEngine。
  2. 此重写仅发生在主机名后面的第一个单词为category的URL上 - 所有以该单词开头的URL将由以下行处理。
  3. 规则将排除指向实际文件的网址!-f
  4. 该规则将排除指向实际目录的网址!-d
  5. 实际规则将捕获整个request_uri并将其作为$ _GET数组中名为parseCategoryUrl.php(查询)的参数的整个请求传递给q文件。规则末尾的标志(L,QSA)做两件事。
    • L - 这是最后一条规则。处理完此行后,.htaccess文件将停止对当前网址执行操作。
    • QSA - 将查询字符串附加到重写的URL(以便我们稍后解析)。
  6. 您的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的搜索引擎: http://domain.com/category/1/2 将无法提取太多信息。但是,如果您的网址包含(根据您的问题要求)类别信息,那么搜索引擎将能够扣除特定网址与之相关的信息:

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

答案 1 :(得分:2)

与生成具有id的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'

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