我想使用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中的多个模式。
怎么可以这样做?
答案 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专家 - 我的专长是正则表达式,我不认为正则表达式会解决你的问题。