У меня есть общий псевдоним, например:
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», кажется, проигнорирована в пользу общей.
Есть ли способ заставить его работать?
Возможное решение - написать регулярное выражение, которое не соответствует URL-адресам, которые вы хотите исключить.
Соответствие в AliasMatch
и некоторые другие директивы на веб-сервере Apache используют PCRE.
Большинство дистрибутивов 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)
известен как отрицательный взгляд вперед:
Lookahead assertions Lookahead assertions start with (?= for positive assertions and (?! for negative assertions. For example, \w+(?=;) matches a word followed by a semicolon, but does not include the semi- colon in the match, and foo(?!bar) matches any occurrence of "foo" that is not followed by "bar". Note that the apparently similar pattern (?!foo)bar does not find an occurrence of "bar" that is preceded by something other than "foo"; it finds any occurrence of "bar" whatsoever, because the assertion (?!foo) is always true when the next three characters are "bar". A lookbehind assertion is needed to achieve the other effect. If you want to force a matching failure at some point in a pattern, the most convenient way to do it is with (?!) because an empty string always matches, so an assertion that requires there not to be an empty string must always fail. The backtracking control verb (*FAIL) or (*F) is a synonym for (?!).