我已经设置了一系列 Web 应用程序,出于安全考虑,这些应用程序只能通过 localhost 直接访问,每个服务都连接到不同的端口。为了使这些应用程序可从外部访问,正在通过 apache 设置反向代理。它一直运行顺利,直到今天添加另一个应用程序,它在初始访问后进行转发(但我不知道通过什么方法,我无法访问执行重定向的代码),这样“proxyHost/bar/”重定向到“proxyHost/search/”而不是“proxyHost/bar/search/”
我多次查看了设置代理的脚本,并尝试了在线阅读的各种方法,但都不起作用。现在我向你们寻求帮助,如果这是一个基本问题或者我的配置有明显缺陷,我深表歉意。我对 Apache 还很陌生。
谢谢!
这是当前配置:
ProxyRequests Off
ProxyPreserveHost On
ProxyHTMLEnable On
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ProxyPass /foo/ http://localhost:1234/
ProxyHTMLURLMap http://localhost:1234 /foo
<Location /foo/>
ProxyPassReverse http://localhost:1234/
ProxyHTMLURLMap / /foo/
ProxyHTMLURLMap /foo /foo
</Location>
ProxyPass /bar/ http://localhost:5678/search
ProxyHTMLURLMap http://localhost:5678/ /bar
<Location /bar/>
ProxyPassReverse http://localhost:5678/
ProxyHTMLURLMap / /bar/
ProxyHTMLURLMap /bar /bar
</Location>
答案1
重申你的问题:
您已安装新的“后端”应用程序,并使其可在/bar
前端主机上访问。访问该应用程序会导致重定向到/search
而不是/bar/search
。
发生这种情况通常是因为后端应用程序对您访问它的前端路径一无所知,并且它会生成绝对(相对于相对)URL。有几种方法可以解决这个问题:
- 某些应用程序允许您配置生成绝对链接时将使用的基本 URL。如果可用,这是最简单的解决方案;您可以将基本 URL 设置为
http://frontendhost/bar
。 - 如果您无法配置或修改应用程序,那么您将需要过滤它生成的 HTML 以重写链接。这(明确地)是mod_proxy_html适用于。请注意,对于 Apache 2.4 及更高版本,
mod_proxy_html
[已包含][] 作为标准模块;对于早期版本的 Apache,您需要单独安装它。
这mod_proxy_html
文档有一些很好的例子。
答案2
尝试以下方法:
ProxyPassReverse /bar/ http://backend.example.com/search/
作为反向代理密码标题重写是什么,你的新应用程序在后端略有不同,因为它托管在 /search 下,而不是像你之前的设置一样
*编辑 抱歉,我之前没有使用过 mod_proxy_html,但您的 ProxyHTMLURLMap 指令也一样。也需要从 /search 映射到 /bar。