15

我正在内部机器上设置 Apache 2.4.6 服务器以进行测试。Apache 服务器应该做的一件事是充当在 localhost:3030 上找到的另一台服务器的反向代理。

localhost:3030 上的服务器在其第一个路径级别上需要几个数据集名称中的一个(目前,该集合仅包含 dataset experimental,但稍后将添加更多),所以我试图从请求的路径。

在我的虚拟主机中,这有效:

<Location /experimental/>
    ProxyPass http://localhost:3030/experimental/
    ProxyPassReverse /
</Location>

对于其他数据集,我可以将其复制并替换experimental为其他数据集名称。显然,这会导致大量代码重复/冗余,这既是错误的来源,也是维护的恐惧。

因此,我想变得更加灵活,并在一个这样的块中处理多个数据集。这应该可以通过LocationMatch指令来实现。

this commentthis page所示,在块内使用时我需要替换。本质上,文档声明相同:ProxyPass ProxyPassMatchLocationMatch

在 LocationMatch 部分中也会发生同样的情况,但是 ProxyPass 不会这样解释正则表达式,因此有必要在这种情况下使用 ProxyPassMatch。

LocationMatch文档解释:

从 2.4.8 开始,命名组和反向引用被捕获并写入到环境中,相应的名称以“MATCH_”为前缀并且大写。这允许从表达式和模块(如 mod_rewrite)中引用 URL 的元素。为了防止混淆,编号(未命名)的反向引用将被忽略。改用命名组。

该信息仅在 Apache 2.4.8 中有效,这可能是以下在我的 2.4.6 安装中不起作用的原因:

<LocationMatch /(?<dataset>experimental)/>
    ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/
    ProxyPassReverse /
</LocationMatch>

另一方面,此页面该帖子暗示可以使用数字组索引($1)(因为帮助文本仅在 httpd 2.4.8 有效,我怀疑/希望数字参考在 2.4.8 之前有效(?)

无论如何,我已经尝试过这个:

<LocationMatch "/(experimental)/">
    ProxyPassMatch http://localhost:3030/$1/
    ProxyPassReverse /
</LocationMatch>

然而根据日志,内部调用调用http://localhost:3030/$1/而不是http://localhost:3030/experimental/在请求experimental虚拟主机 URL 上的路径时调用。

ProxyPassMatch文档只说:

在 LocationMatch 部分中使用时,第一个参数被省略,正则表达式从 LocationMatch 中获取。

但是,文中并没有费心提供如何结合LocationMatch和的示例ProxyPassMatch我究竟做错了什么?

4

2 回答 2

4

该文档还指出When the URL parameter doesn't use any backreferences into the regular expression, the original URL will be appended to the URL parameter.,这似乎是您的情况。此外,您在 ProxyPassReverse指令中缺少主机。

这应该可以正常工作:

<LocationMatch "^/experimental/.*$">
    ProxyPassMatch http://localhost:3030
    ProxyPassReverse http://localhost:3030
</LocationMatch>
于 2018-07-07T19:11:23.420 回答
2

在 Apache 2.4.29 上运行:

<LocationMatch "/fruit/(?:apple|banana|pear)">
    ProxyPass        http://localhost:8080
    ProxyPassReverse http://localhost:8080
</LocationMatch>

Apache调用的URL例如

http://localhost:8080/fruit/apple

(?:在此示例中使用括号时,这一点至关重要。

于 2018-03-06T21:04:22.733 回答