2

所以我目前正在重写规则,我基本上想做以下事情:

\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)...

正如你所看到的,我想一遍又一遍地匹配相同的模式,我可以写出来,但是很多次都适合我目前的目的,但这不是很优雅。由于每次捕获都使用相同的模式,因此如果可以以任意方式编写它会很好,如下所示:

(?:\/([\w+-]+))+

然后理想情况下,我可以按如下方式分配重写:

$1.php?one=$2&two=$3...

有谁知道这是否可能?可能不是,但从来没有伤害过问。

4

1 回答 1

0

这种想法称为重复捕获组,这是不可能的。想象一下:捕获的字符([\w+-]+)被放入缓冲区,第二个匹配简单地覆盖第一个。

一个实用的解决方案是捕获整个内容,并在 php(或任何其他服务器端脚本)中处理它:

RewriteRule (.*) index.php?req=$1

然后在 PHP 中:

list($_GET['one'], $_GET['two'], $_GET['three']) = explode('\', $_GET['req'])

或者......嗯,这是非常不切实际的,但你可以通过使用递归来使用 mod_rewrite 来做到这一点:每次迭代都会识别最后一段,将其传递给 query_string 等。它在生产中不起作用(因为 Apache 有递归限制设置为低),但这是一个很好的提醒,mod_rewrite 是图灵完备的。

于 2013-01-28T22:55:11.220 回答