mod_alias中AliasMatch正则表达式 - 相匹配的文件夹中的一切,除了两种模式?
题
我想使用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否定多种模式。
怎么能这样做?
解决方案
你在谈论被称为的排除模式的是什么,你只是它环绕的正则表达式,你不想来匹配,这样的内容:(?!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
或者你可以,或者通过切换到mod_rewrite的做一个<DirectoryMatch>
指令东西。但我(显然)不是一个Apache专家 - 我的特长是正则表达式,我不认为一个正则表达式是要解决你的问题。
其他提示
MODALIAS事实上确实支持负向前看符号。我使用这个在我的网站,它工作得非常好:
AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file
请务必让你的正则表达式开始以“/”,因为它始终是第一个字符用mod_alias中!不要试图用在先行启动您的规则,否则解析将会失败。