mod_alias AliasMatch Regex - 匹配除两个模式之外的文件夹中的所有内容?

时间:2009-08-30 02:30:14

标签: regex alias mod-alias

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

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

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

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

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

我知道NOT(!)字符可用于否定模式,但我不知道如何在此处使用它,或者如何否定AliasMatch中的多个模式。

怎么可以这样做?

2 个答案:

答案 0 :(得分:3)

ModAlias事实上支持负向前瞻。我在我的网站上使用它,效果非常好:

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

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

答案 1 :(得分:1)

您所谈论的内容称为否定前瞻,您只需将其包装在正则表达式中,以便您不想匹配,例如:(?!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专家 - 我的专长是正则表达式,我不认为正则表达式会解决你的问题。