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

ada*_*Lev 5 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]
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Tom*_*lak 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进行一些字符串处理.


and*_*dri 9

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

  • +1,因为虽然(如您所指出的)是一个“愚蠢”的想法,但它实际上是一个有效的想法。 (2认同)

Dav*_*unt 5

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

然后使用index.php通过正斜杠分解请求URI,您可以使用数据进行处理.