如何将已有的类别和产品转换为SEO友好的URL

时间:2016-07-01 09:47:20

标签: php mysql .htaccess mod-rewrite

我最近采取了将旧购物车网站(自定义开发)转换为现代SEO友好网站的项目

这是我的问题,当前网站使用的URL如下所示

http://www.domain.com/page.php?id=XX

我想将现有的网页数据库(产品和类别)转换为类似于以下内容的网址

http://www.domain.com/confectionery-&-snacks/lollies/cola-zombie-chews

如果用户要删除cola-zombie-chews,则url看起来如下所示并加载页面lollies等等,如果lollies被删除它将加载页面糖果&小吃

http://www.domain.com/confectionery-&-snacks/lollies/

当前的数据库设置类似于下面的

   ID   |    TYPE   | NAME
--------+-----------+------------
   1    |  category | confectionery & snacks
   2    |  category | lollies
   3    |  product  | cola zombie chews

另一个问题是URL可能有4个类别,例如见下文

http://www.domain.com/frozen-foods/seasonal/christmas/meat/smoked-salmon-1kg

我需要什么类型的重写规则以及检查数据库中存在的url需要什么类型的代码

我考虑过在数据库中添加另一个用于slug的colum并复制名称并删除空格并替换为 -

3 个答案:

答案 0 :(得分:2)

我认为@Vrac做了一个很好的答案+1 :)。 @AntoineB也有一点意义。所以我想在网址创建部分添加一种稍微不同的方式和更详细的内容。

您想使用搜索引擎友好的网址,您需要两件事:

  1. 将所有网址替换为网站中的所有网址.php?id = XX。因此,此时点击新网址将返回404。

  2. 所有新网址都应该对你的php有意义 - 这是.htaccess + php路由器的工作。

  3. 步骤#1的

    在每个产品页面上,我猜您可以访问哪个产品属于哪个类别。如果数据库模式与您提供的内容相同,则架构不足以确定哪个类别在哪个类别中。因此,您需要第4列parent,它将存储每个类别或产品的父类别的ID。 无论是类别还是对象,它们都有一个类别为父或null

    在生成类别或产品URL的页面中的php中,您需要从数据库中获取与当前项目关联的所有类别,并从最后一个嵌套节点(当前项目)爬到树上。

    所以你将有一个循环,如下面的简化代码。

    提示:

    • 如果项目数量很少,一次从db中获取所有内容以保存数据库查询然后循环结果(在数组中) - 将其称为案例a;
    • 否则从仅查询其id中的当前项开始并获取其父项,然后在循环中再次执行查询以获取新父项 - 将其称为案例b;

    所以你得到父母的父母,依此类推,直到父母为空。

    <?php
    
    $itemTree = [];
    $allDBItems = mysql_query('SELECT * FROM items');
    
    while($parent)
    {
        // getParent() is a function that loops on $allDBItems - in case a - and break loop on found $currItemInLoop['id'] === $myItem['parent']
        // or - in case b - query the db like mysql_query("SELECT * FROM items WHERE id = $myItem[parent]");
        $parent = getParent();
    
        if ($parent) $itemTree[] = $parent;
    }
    
    $itemUrl = implode('/', array_reverse($itemTree));
    

    是的,你已经生成了网址!

    第2步

    .htaccess中的

    将所有网址重定向到page.php,没有例外情况如下(我希望您的名称可以比page.php或至少index.php更有意义作为根脚本)。

    RewriteRule ^(.*)$ index.php?path=$1 [NC,L,QSA] 
    

    几乎像@Vrac写道。

    然后在index.php做@Vrac写道:

    $path = $_GET('path');
    $patharray = explode('/',$path);
    //do processing based on contents of patharray 
    $category = $patharray[0];
    $product = $patharray[1];
    //etcetera, etcetera...
    //serve up content based on the path that was requested
    

    你完成了! :)

答案 1 :(得分:1)

我从您的描述中了解到存在两个问题:1)将现有链接的请求转换为&#34;漂亮的网址&#34; 2)处理&#34;漂亮的网址&#34;往前走。由于您需要进行数据库查找以将现有链接的请求映射到新URL,因此.htaccess对问题#1的帮助不大。我假设世界上已经有一堆指向page.phpid=xx的链接在page.php你可以进行数据库查找然后发送重定向,类似于(伪代码 - ISH):

(你必须&#34;压扁&#34;你的桌子变成带有交叉表查询的单个字符串,这是我在这里不会处理的另一个问题,比如说为了论证你已经完成了它并且用一个字符串作为url)

$id = $_GET('id');
select concat(category,product, etcetera, etcetera) as url from mypagestable where id = $id;
//redirect the browser to the pretty url
header("Location: $url",TRUE,301);
//stop processing here, browser will get the new url and request that instead
exit;

现在请求将从浏览器进入新的&#34; url&#34;,在htaccess中你可以把它放在:

RewriteCond %{REQUEST_URI} !^page\.php
RewriteRule ^(.*)$ mynewurlprocessor.php?path=$1 [NC,L,QSA]

这将忽略对page.php的任何请求,因为您已经在page.php中处理这些请求,您不想弄乱它们。 mynewurlprocessor.php将请求的路径作为查询字符串参数获取,因此在mynewurlprocessor.php中,您可以执行以下操作:

$path = $_GET('path');
$patharray = explode('/',$path);
//do processing based on contents of patharray 
$category = $patharray[0];
$product = $patharray[1];
//etcetera, etcetera...
//serve up content based on the path that was requested

因为,正如你所说,内容是动态的和数据库驱动的,最好将所有逻辑保存在php中,并且只使用htaccess为你的php脚本提供他们提供正确内容所需的数据。为&#34; slug&#34;提供另一个专栏是个好主意。您的问题非常广泛,我只是给您一个关于如何设计它的高级视图。如果您对将表id-type-name结构转换为扁平字符串或如何转动&#34;漂亮&#34;的机制有疑问请求进入另一端的数据库查询,我建议你为这些问题提出新的,更具体的问题。

答案 2 :(得分:0)

.htaccess文件中,请粘贴以下代码:

RewriteBase /

RewriteRule ^([a-zA-Z0-9=^_-]+)$ home.php?sname=$1


RewriteRule ^([a-zA-Z0-9=^_-]+)/$ home.php?sname=$1

RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)$ home.php?sname=$1&dname=$2


RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/$ home.php?sname=$1&dname=$2


RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)$ home.php?sname=$1&dname=$2&catname=$3


RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/$ home.php?sname=$1&dname=$2&catname=$3

RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)$ home.php?sname=$1&dname=$2&catname=$3&subcat=$4


RewriteRule ^([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/([a-zA-Z0-9=^_-]+)/$ home.php?sname=$1&dname=$2&catname=$3&subcat=$4

和url访问如下:

http://www.domain.com/confectionery-&-snacks/lollies/cola-zombie-chews/abc

$sname= confectionery-&-snacks


$dname= lollies


$catname= cola-zombie-chews


$subcat= abc

我希望你理解它。

如果您遇到任何问题,请再次询问我。