您所说的称为负前瞻,您只需将它包裹在您不想匹配的正则表达式中,如下所示(?!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 专家——我的专长是正则表达式,我认为正则表达式不会解决你的问题。