所以我现在正在研究重写规则,我基本上想要做以下事情:
\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)...
正如你所看到的,我想要一遍又一遍地匹配相同的模式,我可以写出来,但多次适合我目前的目的,但那不是很优雅。由于每次捕获都是相同的模式,如果可以以任意方式编写它会很好,如下所示:
(?:\/([\w+-]+))+
然后理想情况下,我可以按如下方式分配重写:
$1.php?one=$2&two=$3...
任何人都知道这是否可行?可能不会,但从来没有伤害过要求。
答案 0 :(得分:0)
这个想法被称为repeated capture group,但这是不可能的。想象一下:([\w+-]+)
的捕获字符放在一个缓冲区中,第二个匹配只是覆盖第一个。
一个实用的解决方案是捕获整个事物,并在php(或任何其他服务器端脚本)中处理它:
RewriteRule (.*) index.php?req=$1
然后在PHP中:
list($_GET['one'], $_GET['two'], $_GET['three']) = explode('\', $_GET['req'])
或者......好吧,这是非常不切实际的,但你可以通过使用递归来使用mod_rewrite:每次迭代都会识别最后一个段,将它传递给query_string等。它在生产中不起作用(如Apache sanely将递归限制设置为低值),但它提醒我mod_rewrite是图灵完成的。