mod_rewrite参数数量/反向引用限制

时间:2009-04-03 18:17:58

标签: regex apache mod-rewrite

显然,你可以在htaccess RewriteRules中访问多少个反向引用有一个限制(9)。

但是我们有一个需要9个以上参数的RewriteRule,如下所示:

RewriteRule ^([^/]+)/b([0-9]+)(/a([0-9]+))?(/v([0-9]+))?(,([0-9]+))?(/(ajax|share))?(,complete)?$ /index.php?control=sites&site=brands&control_file=version_select&name=$1&campaign_id=$2&answer=$4&page=$8&option=$10&video_id=$6&page_type=research [L]

当你尝试访问“$ 10”时会发生什么,是它使用$ 1并在它旁边放一个0。

有没有人能够解决这个问题,任何替代解决方案或任何其他解决方案?

谢谢!

3 个答案:

答案 0 :(得分:18)

实际上,你不需要捕捉所有东西。为你不想重复使用的东西写非捕获组(用"?:"引入),这应该会给你一些喘息空间。比较:

Yours:                       Mine:
-------------------------    ---------------------------
^([^/]+)/b          $1       ^([^/]+)/b            $1
([0-9]+)            $2       ([0-9]+)              $2
(/a([0-9]+))?       $4       (?:/a([0-9]+))?       $3
(/v([0-9]+))?       $6       (?:/v([0-9]+))?       $4
(,([0-9]+))?        $8       (?:,([0-9]+))?        $5
(/(ajax|share))?    $10!     (?:/(ajax|share))?    $6
(,complete)?$       $11!     (,complete)?$         $7

但仅使用mod_rewrite,就不能超过9个反向引用。如果您需要更多,请使用替代方法 - 例如,仅在重写中捕获最重要的部分,并使用应用程序中其余URL进行一些字符串处理。

答案 1 :(得分:9)

其中一个,虽然相当愚蠢,但想法是分两步进行重写,即第二条链RewriteRule,第一条规则将其重写为某种中间格式。

答案 2 :(得分:5)

一种解决方案可能是使用相同的正则表达式而不进行捕获,并将请求传递给index.php

然后使用index.php通过正斜杠爆炸请求URI,你可以在那里使用数据。