我有一个通用别名匹配,例如:
AliasMatch ^/plugins/([^/]*)/(.*) /usr/share/tuleap/plugins/$1/www/$2
<DirectoryMatch "/usr/share/tuleap/plugins/([^/]*)/www/">
...
</DirectoryMatch>
我想为目录插件添加特定配置。我先尝试使用别名,但它没有按预期工作:
Alias /plugins/git /usr/share/tuleap/plugins/git/www
<Directory /usr/share/tuleap/plugins/git/www>
...
</Directory>
AliasMatch ^/plugins/([^/]*)/(.*) /usr/share/tuleap/plugins/$1/www/$2
<DirectoryMatch "/usr/share/tuleap/plugins/([^/]*)/www/">
...
</DirectoryMatch>
“git” 的特定配置集似乎被忽略,而采用通用配置集。
有解决方案可以使它发挥作用吗?
答案1
一种可能的解决方案是编写一个与要排除的 URL 不匹配的正则表达式。
匹配AliasMatch
以及 Apache Web 服务器使用的一些其他指令聚合酶链反应。
大多数 GNU/Linux 发行版都已pcre-tools
预编译。此软件包包含几个工具pcregrep
和pcretest
,非常方便测试与 Perl 兼容的正则表达式:
$ cat <<EOF>test.txt
> /plugins/git
> /plugins/foo
> /plugins/bar
> EOF
$ pcregrep '^/plugins/(?!git)' test.txt
/plugins/foo
/plugins/bar
$ pcretest
PCRE version 8.33 2013-05-28
re> /^\/plugins\/(?!git)/
data> /plugins/git
No match
data> /plugins/foo
0: /plugins/
在这种情况下,子表达式(?!git)
被称为负面前瞻:
前瞻断言 前瞻断言以 (?= 开头,表示肯定断言;以 (?! 开头,表示 否定断言。例如, \w+(?=;) 匹配后跟分号的单词,但不包括分号 匹配中的冒号,以及 foo(?!酒吧) 匹配任何后面不跟有“bar”的“foo”。注意 看似相似的模式 (?!foo)酒吧 没有找到“bar”的出现,并且该出现之前有其他东西 除了“foo”之外,它还会找到任何“bar”的出现,因为 当接下来的三个字符是 “bar”。需要后视断言来实现其他效果。 如果你想在模式的某个点强制匹配失败, 最方便的方法是使用(?!)因为空字符串 总是匹配,因此要求不为空的断言 字符串必须始终失败。回溯控制动词 (*FAIL) 或 (*F) 是 (?!) 的同义词。