【问题标题】:Can one use named backreference's in Apache mod_rewrite可以在 Apache mod_rewrite 中使用命名反向引用吗
【发布时间】:2010-10-26 23:08:54
【问题描述】:

全部,

我在我的一个 RewriteRules 中遇到了一个有趣的小怪癖,我想通过使用命名的反向引用来解决这个问题。但是据我所知,这在 Apache 的 mod_rewrite 中是不可能的。

我有两个传入的 url,每个都包含一个关键变量,需要将其重写为相同的底层框架操作。

传入的网址:

/users/list/page-2
/users/list/2

所需的重写端点

/?module=users&action=list&pagenum=2

我本来想做这样的事情

RewriteRule ^/(?P([\w]+))/(?P([\w]+))/(page-)?(?P([\ d]+))$ /?module=${module}&action=${action}&pagenum=${pagenum} [L,QSA]

但是 Apache 根本不想这样玩,并在命名反向引用的位置给我空值。为了解决这个问题,我使用了对捕获组的数字引用($1、$2、$4)(但我几乎达到了 N=9 apache 限制的一半)。所以这对我来说不是一个表演停止者。

我只想知道,Apache 的 mod_rewrite 中是否有命名反向引用,如果有,为什么我的 RewriteRule 的模式不匹配?

谢谢, 伊恩

【问题讨论】:

    标签: regex mod-rewrite apache2 backreference


    【解决方案1】:

    【讨论】:

    • 这当然是实现预期结果的一种方式,但正如我在问题中所述,我已经使用数字参考有一个内联解决方案。我的问题直接指向使用 PCRE 的内联命名反向引用,它们是否可以使用,如果可以,为什么我的 RewriteRule 不起作用。
    • 我认为不支持命名重写。 “RewriteCond 指令”下只有四种方法: 1. RewriteRule 反向引用 2. RewriteCond 反向引用 3. RewriteMap 扩展(我的建议) 4. Server-Variables。其中只有两个是非数字的。在非数字方法中,它不会做你想做的事情。
    • 是的,我在 doco 中读到了相同的内容,听起来很公平,因为反向引用 N 属于集合 (1
    • 混淆来自说明 mod_rewrite 使用 PCRE 的文档。解决方案源自文档,因为它指出反向引用标签为 N,其中 (1不支持命名反向引用。
    【解决方案2】:

    如果@superspace 的最新答案不起作用,我建议将所有不指向文件/目录的链接路由到索引页面。然后设置一个路由类,它接受页面名称并进行手动匹配,这样您就可以拥有命名的捕获正则表达式数组并列出您想要提供的模板或页面。

    如果您必须这样做,请告诉我,我可以提供一些课程中的代码。

    【讨论】:

    • 过去曾在各种框架中使用过此类。当 mod_rewrite 不可用,或者您使用托管的网络服务器并且支持团队很慢时,特别方便。但是,是的,我有一个简单的内联解决方案,但是如果知道命名的反向引用是否可用以及如何使用,那就太棒了。
    【解决方案3】:

    在查看 mod_rewrite 源代码后,似乎没有反向引用。

    我还是建议使用 RewriteMap 选项而不是一长串 RewriteRules,因为它比遍历一个冗长的列表要快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多