我正在尝试构建一个 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}/
作为模式,Apache 会记录一条警告:“AH00111:配置变量 ${MATCH_OFFICENAME} 未定义”。
我的错误在哪里?
答案1
语法没有 env:
是正确的。AH00111
它产生的警告信息是虚假的,根据Apache 错误 #58467。
配置:
<LocationMatch "^/testadmin-(?<OFFICENAME>\w+)/(.*)$">
ProxyPassMatch http://$1.example.com:3000/$2
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLInterp On
ProxyHTMLURLMap / /testadmin-${MATCH_OFFICENAME|unknown}/ VL
RequestHeader unset Accept-Encoding
</LocationMatch>
除每次启动时出现虚假警告外,一切按预期工作。