我最近采取了将旧购物车网站(自定义开发)转换为现代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并复制名称并删除空格并替换为 -
答案 0 :(得分:2)
我认为@Vrac做了一个很好的答案+1 :)。 @AntoineB也有一点意义。所以我想在网址创建部分添加一种稍微不同的方式和更详细的内容。
您想使用搜索引擎友好的网址,您需要两件事:
将所有网址替换为网站中的所有网址.php?id = XX。因此,此时点击新网址将返回404。
所有新网址都应该对你的php有意义 - 这是.htaccess
+ php路由器的工作。
,
在每个产品页面上,我猜您可以访问哪个产品属于哪个类别。如果数据库模式与您提供的内容相同,则架构不足以确定哪个类别在哪个类别中。因此,您需要第4列parent
,它将存储每个类别或产品的父类别的ID。
无论是类别还是对象,它们都有一个类别为父或null 。
在生成类别或产品URL的页面中的php中,您需要从数据库中获取与当前项目关联的所有类别,并从最后一个嵌套节点(当前项目)爬到树上。
所以你将有一个循环,如下面的简化代码。
提示:的
所以你得到父母的父母,依此类推,直到父母为空。
<?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
我希望你理解它。
如果您遇到任何问题,请再次询问我。