2

我想使用 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 中否定多个模式。

怎么可能做到这一点?

4

2 回答 2

5

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

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

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

于 2012-10-01T22:11:48.033 回答
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 专家——我的专长是正则表达式,我认为正则表达式不会解决你的问题。

于 2009-08-30T03:11:43.380 回答