2011-06-24 64 views
1

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

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

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

这种方法的问题是,每个类别需要唯一它的正式工作的简称。当我有多个具有相同名称的类别时,这会产生一个问题,并带有不同的类别,例如, /类别/ 2011/1月和/类别/ 2010/1月。

解决这个问题的最简单方法是在创建重复短名称时追加-1,-2等,但我更愿意在URL中使用整个类别层次结构并根据此确定正确的Ids,例如

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

具有相同的代码,并给我的PHP页面它们在URL中规定的顺序这些类别的阵列?

然后,我的代码需要从最后一个类别开始向后工作,根据它的父母找出需要哪个类别。

这是什么,这将是可行的(实际上推荐),任何人都可以给我一个手生产用于重写命令正确的正则表达式,因为我正则表达式的漂亮无望的把握?

很多感谢 尼克

回答

3

我不认为有什么简单的方法来让mod_rewrite的分割数据为您服务。当然,您可以构建一个匹配9条虚拟路径的RewriteRule,但我认为这不会有帮助。相反,我建议这样定义

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

的规则,然后执行分裂(和重新排序)在PHP文件,像这样

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

这应该是足够的(没有必要昂贵的'preg_ *'函数):'$ splittedCat = explode('/',$ cat);'。但在整体 - 我不同意,这样的路由好得多在PHP实现,因为Apache的mod_rewrite最有可能将无法很好地实现这一点(一个可能的方法是太循环吧'[N]'...但它不够安全/足够灵活 - 需要很多真实示例测试)。我知道肯定 - 这可以通过使用'赫利的ISAPI_Rewrite 3'(其中模仿的mod_rewrite)我做到了我自己(它具有循环的特殊标志)来完成..但它要在Windows上使用IIS。 +1 – LazyOne

+0

感谢jCoder - 出于某种原因,传递整个类别字符串在PHP中进行拆分的简单原则完全逃脱了我!这应该是一个很好的解决方案。 – Nick