我正在尝试构建一个 Apache 反向代理,以使一组服务器可以通过单点访问进行访问。这些服务器都在端口 3000 上提供了一个 Web 管理界面,我打算将它们都显示为反向代理上的目录。接口包含本地链接,当然必须重写这些链接才能转到代理上正确服务器的子目录。
我可以为每个服务器单独使用这样的配置片段来实现所需的行为:
<Location /testadmin-warsaw/>
ProxyPass http://warsaw.example.com:3000/
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap / /testadmin-warsaw/ L
RequestHeader unset Accept-Encoding
</Location>
由于随着服务器的来来去去,这变得相当乏味且容易出错,因此我的目标是动态配置。根据 Apache 文档,以下应该可以工作:
<LocationMatch "^/testadmin-(?<OFFICENAME>\w+)/(.*)$">
ProxyPassMatch http://$1.example.com:3000/$2
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLInterp On
ProxyHTMLURLMap / /testadmin-${env:MATCH_OFFICENAME|unknown}/ VL
RequestHeader unset Accept-Encoding
</LocationMatch>
<LocationMatch>
将环境变量设置MATCH_OFFICENAME
为目录的办公室名称部分,ProxyHTMLURLMap
并将此名称插入到重写链接的适当位置。
但是,当我测试该配置时,最初指向的链接会/other/page.html
被重写,/testadmin-unknown/other/page.html
而不是/testadmin-warsaw/other/page.html
按预期进行。换句话说,ProxyHTMLURLMap
就像MATCH_OFFICENAME
未设置环境变量一样。
如果我省略该env:
部分并/testadmin-${MATCH_OFFICENAME}/
按照 to 模式放置,Apache 会记录一个警告:“AH00111:未定义配置变量 ${MATCH_OFFICENAME}”。
我的错在哪里?
没有 的语法
env:
是正确的。根据Apache Bug #58467AH00111
,它产生的警告消息是虚假的。配置:
按预期工作,除了每次启动时的虚假警告。