【问题标题】:mod_alias AliasMatch Regex - matching everything in a folder except two patterns?mod_alias AliasMatch Regex - 匹配文件夹中除两个模式之外的所有内容?
【发布时间】:2009-08-30 02:30:14
【问题描述】:

我想使用 AliasMatch 为文件夹中的所有内容创建别名,除了为两个(或更多)特定的正则表达式模式。

例如,以下 AliasMatch 为“内容”文件夹中的所有内容创建别名:

AliasMatch /content(.*) /home/username/public_html/$1

但是有两个正则表达式模式我不希望上面的别名匹配,例如:

^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)

我知道 NOT (!) 字符可以用来否定一个模式,但我不知道如何在这里使用它,或者如何在 AliasMatch 中否定多个模式。

这是怎么做到的?

【问题讨论】:

    标签: regex alias mod-alias


    【解决方案1】:

    ModAlias 实际上支持负前瞻。我在我的网站上使用它,效果很好:

    AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file
    

    确保您的正则表达式以“/”开头,因为它始终是 mod_alias 的第一个字符!永远不要尝试通过前瞻来开始您的规则,否则解析将失败。

    【讨论】:

      【解决方案2】:

      您所说的称为负前瞻,您只需将它包裹在您不想匹配的正则表达式中,如下所示:(?!foo)。组合正则表达式可以像用管道将它们串在一起一样简单,但在这种情况下你可以做得更好一点。这个正则表达式重用了两个正则表达式的第一部分,这是相同的:

      [a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)
      

      因为管道(或'|',交替运算符)的优先级比其他任何东西都低,所以交替必须包含在一个组中。请注意,我使用了一个非捕获组——即(?:...)——并去掉了正则表达式中的括号。否则,他们将放弃您确实想要捕获的一个组的编号,并且您将不得不在规则的第二部分中使用 $1 以外的其他内容。这是整个正则表达式:

      ^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)
      

      编辑:显然,AliasMatch 使用的正则表达式风格不支持前瞻,但有自己的否定语法:!(^/foo)。它的目的似乎是否定整个正则表达式,这意味着它不会帮助你,但也许你不需要它。也许您可以将这些目录别名为自己。这样你就不必否定任何东西了。

      AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1
      AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1
      AliasMatch ^/content/(.*) /home/username/public_html/$1
      

      或者您可以使用<DirectoryMatch> 指令或切换到 mod_rewrite 来做一些事情。但我(显然)不是 Apache 专家——我的专长是正则表达式,我不认为正则表达式能解决你的问题。

      【讨论】:

      • 非常感谢 :) 但是,在我将您提供的内容复制到我的 httpd.conf(如“AliasMatch [regex] /home/username/public_html/$1”)之后,httpd 不再编译 - 它给出“无法编译正则表达式”。语法错误。这里会有什么问题?我用错了吗?
      • 问题似乎与前瞻有关 - httpd.conf 似乎无法解析它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2014-12-11
      • 1970-01-01
      • 2013-06-17
      • 2014-01-30
      • 2021-05-26
      • 2022-08-21
      相关资源
      最近更新 更多