代码之家  ›  专栏  ›  技术社区  ›  adamJLev

mod重写参数数量/返回引用限制

  •  5
  • adamJLev  · 技术社区  · 17 年前

    显然,在htaccess rewriterules中可以访问多少backreference有一个限制(9)。

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

    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 回复  |  直到 17 年前
        1
  •  18
  •   Tomalak    17 年前

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

    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_重写,就不能超过9个后引用。如果您需要更多,请使用另一种方法-例如,只捕获重写中最重要的部分,并使用应用程序中URL的其余部分进行一些字符串处理。

        2
  •  9
  •   andri    17 年前

    第一,虽然相当愚蠢,但想法是用两个步骤来重写,也就是说,第二链 RewriteRule 与第一个规则重写成某种中间格式。

        3
  •  5
  •   David Snabel-Caunt    17 年前

    一种解决方案可能是使用相同的regex,不使用捕获,并将请求传递到index.php。

    然后使用index.php将请求uri分解为正斜杠,您可以在那里处理数据。

    推荐文章