我有一个通用的别名匹配,如:
AliasMatch ^/plugins/([^/]*)/(.*) /usr/share/tuleap/plugins/$1/www/$2 <DirectoryMatch "/usr/share/tuleap/plugins/([^/]*)/www/"> ... </DirectoryMatch>
我想为目录插件添加一个特定的configuration。 我试着有一个别名第一,但它不能按预期工作:
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”设置的特定configuration似乎被忽略,而不是通用configuration。
有没有解决scheme,使其工作?
一个可能的解决scheme是编写一个正则expression式,它与您想要排除的URL不匹配。
AliasMatch的匹配和Apache Web Server中的一些其他指令使用PCRE 。
大多数GNU / Linux发行版都有预编译pcre-tools 。 这个软件包包含一些工具, pcregrep和pcretest ,非常方便的testingPerl兼容的正则expression式:
$ 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/
在这种情况下,子expression式(?!git)被称为负向前瞻 :
Lookahead断言
前瞻断言以(?=表示肯定断言,(?!表示断言)开始
负面的断言。 例如,
\ W +(=;?)
匹配一个单词后跟一个分号,但不包含半angular英文单词,
结肠在比赛中,和
富(?!栏)
匹配任何不是“bar”后面的“foo”。 注意
那显然是相似的模式
(?!FOO)酒吧
没有发现一个事件前面的“酒吧”的发生
除“foo”以外; 它发现任何“酒吧”的发生,因为
当接下来的三个字符是断言(?!foo)总是为真
“酒吧”。 为了达到另一个效果,需要一个向后看的断言。
如果你想在一个模式中的某个点强制匹配失败,
最方便的方法是用(?!)因为一个空string
总是匹配,所以一个断言,要求没有一个空的
string必须总是失败。 回溯控制动词(* FAIL)或(* F)
是(?!)的同义词。