mod_alias中AliasMatch正则表达式 - 相匹配的文件夹中的一切,除了两种模式?

StackOverflow https://stackoverflow.com/questions/1352920

  •  20-09-2019
  •  | 
  •  

我想使用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中!不要试图用在先行启动您的规则,否则解析将会失败。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top