Назад | Перейти на главную страницу

Можно ли смешивать Alias ​​и AliasMatch с Apache

У меня есть общий псевдоним, например:

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 (?!).