我正在内部机器上设置 Apache 2.4.6 服务器以进行测试。Apache 服务器应该做的一件事是充当在 localhost:3030 上找到的另一台服务器的反向代理。
localhost:3030 上的服务器在其第一个路径级别上需要几个数据集名称中的一个(目前,该集合仅包含 dataset experimental
,但稍后将添加更多),所以我试图从请求的路径。
在我的虚拟主机中,这有效:
<Location /experimental/>
ProxyPass http://localhost:3030/experimental/
ProxyPassReverse /
</Location>
对于其他数据集,我可以将其复制并替换experimental
为其他数据集名称。显然,这会导致大量代码重复/冗余,这既是错误的来源,也是维护的恐惧。
因此,我想变得更加灵活,并在一个这样的块中处理多个数据集。这应该可以通过LocationMatch
指令来实现。
如this comment和this page所示,在块内使用时我需要替换。本质上,文档声明相同:ProxyPass
ProxyPassMatch
LocationMatch
在 LocationMatch 部分中也会发生同样的情况,但是 ProxyPass 不会这样解释正则表达式,因此有必要在这种情况下使用 ProxyPassMatch。
从 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 上的路径时调用。
在 LocationMatch 部分中使用时,第一个参数被省略,正则表达式从 LocationMatch 中获取。
但是,文中并没有费心提供如何结合LocationMatch
和的示例ProxyPassMatch
。我究竟做错了什么?