htaccess:重写无限子目录

时间:2011-06-24 12:27:16

标签: .htaccess mod-rewrite

我有一个相当复杂的内容管理系统,我用PHP编写,它有无限的分层类别。

每个类别都有一个短名称(从类别标题动态生成),我使用mod_rewrite生成干净的URL,例如

http://www.mysite.com/categories/january

这种方法的问题是每个类别都需要一个唯一的短名称才能正常工作。当我有多个具有相同名称且具有不同类别的类别时,这会产生问题。 / categories / 2011/1月和/ categories / 2010/1月。

最简单的方法是在创建重复的短名称时附加-1,-2等,但我更希望在URL中使用整个类别层次结构并根据此确定正确的ID,例如

http://www.mysite.com/categories/2011/january vs http://www.mysite.com/categories/2010/january

我的问题是:有没有办法可以使用mod_rewrite来解析任意数量的子类别,并将这些子类别返回到我的php页面,可能是一个值数组?

无论子类别的数量如何,它都需要工作,因此它可以处理,例如。

http://www.mysite.com/categories/products/sheds/reports/2011/january

使用相同的代码,并按照URL中显示的顺序为我的php页面提供这些类别的数组?

然后我的代码需要从最后一个类别向后工作,以根据父母的身份确定需要哪个类别。

这是否可行(并且确实推荐),并且任何人都可以帮我为重写命令生成正确的正则表达式,因为我对正则表达式毫无希望的掌握?

非常感谢提前 尼克

1 个答案:

答案 0 :(得分:3)

我认为没有任何简单的方法让mod_rewrite为您分割数据。当然,您可以构建一个匹配多达9个虚拟路径的RewriteRule,但我不认为这会有所帮助。相反,我建议定义像这样的规则

RewriteRule ^categories/(.*)$ category-handler.php?cat=$1

然后在PHP文件中进行拆分(和重新排序),类似这样

$cat = $_GET['cat'];
$splittedCat = array_reverse(preg_split('/\//', $cat));