是否可以将 Alias 和 AliasMatch 与 Apache 混合使用

是否可以将 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” 的特定配置集似乎被忽略,而采用通用配置集。

有解决方案可以使它发挥作用吗?

答案1

一种可能的解决方案是编写一个与要排除的 URL 不匹配的正则表达式。

匹配AliasMatch以及 Apache Web 服务器使用的一些其他指令聚合酶链反应

大多数 GNU/Linux 发行版都已pcre-tools预编译。此软件包包含几个工具pcregreppcretest,非常方便测试与 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)
       是 (?!) 的同义词。

相关内容