** 在本答案底部更新了解决方法 **
我需要我的 webapp 代理 2 个外部报告服务器。因此我将为每个外部报告服务器设置一个菜单项。
但是浏览器 URL 看起来也像是我的服务器,所以我不能直接重定向。这些服务器都有相同的上下文根 /ibm
对于两个服务器,浏览器 URL 应如下所示http://example.com/ibm..而apache代理到正确的一个。
这样的设置该如何完成?Apache 如何知道要代理哪一个?
如果我不得不做一些改变,那么 URL 就会变成这样:
http://example.com/rep1/ibm and http://example.com/rep2/ibm
我设法使用我的 weblogic-proxy servlet 并操作 URL 等来获得预期的效果,但如果可以以某种方式做到这一点,Apache 将是一个更有效的解决方案。
我非常感谢您的意见。
此外,对外部报告服务器的初始请求是从我的 web 应用程序发起的,而不是从浏览器发起的。
** 更新 **
我们现在必须代理大约 10 个其他 Web 服务器,其中一些服务器存在此问题。但每当目标 Web 服务器部署在根目录中时,我们还必须重写主体等。对于其中一些代理集成来说,这需要大量的反复试验。
解决方法:我们已经为这些代理网络服务器切换到子域名,实际上子域名 URL 仍然指向我们自己的 Apache,但使用这些子域名,我们可以更轻松地在 Apache 配置中设置虚拟主机和代理,并且我们不必重写任何响应主体等。
答案1
这很容易做到mod_proxy
:
ProxyPass /rep1/ibm http://reportingserver1.example.com/ibm
ProxyPassReverse /rep1/ibm http://reportingserver1.example.com/ibm
ProxyPass /rep2/ibm http://reportingserver2.example.com/ibm
ProxyPassReverse /rep2/ibm http://reportingserver2.example.com/ibm
更多信息请访问mod_proxy 的 apache 文档站点。
如果您需要更改从外部网站返回的内容中的链接,则可以使用mod_ext_filter。以下是重写链接的示例配置:
# mod_ext_filter directive to define a filter which
# replaces text in the response
#
# Note: I'm Using a '#' instead of an '/' in the sed command since I want to
# include '/' in the string
#
ExtFilterDefine rep1 mode=output intype=text/html \
cmd="/bin/sed s#reportingserver1.example.com/ibm#example.com/rep1/ibm#g"
<Location /rep1>
# core directive to cause the fixtext filter to
# be run on output
SetOutputFilter rep1
ProxyPass /rep1/ibm http://reportingserver1.example.com/ibm
ProxyPassReverse /rep1/ibm http://reportingserver1.example.com/ibm
</Location>
答案2
现在,我能够使用 mod_proxy 进行反向代理,并使用 mod_proxy_html 和 ProxyHTMLURLMap 重写返回的内容。初始页面加载正常,所有 URL 等都已重写,当我将鼠标悬停在它们上面时,它们会显示 rep1 前缀。
但是当我单击代理应用程序中的菜单之一时,我认为正在执行 Ajax 请求并且将插入返回的页面。但我面临的问题是返回的内容被"<html><body>"
标签包围。因此我认为页面没有更新。
我正在尝试弄清楚如何阻止 proxy_html 执行此操作。
我当前的配置:
ProxyPass /MD/ http://xx.xxx.xxx.xx:8080/
<Location /MD/>
ProxyHTMLURLMap /ibm/ /MD/ibm/
ProxyHTMLURLMap /mum/ /MD/mum/
ProxyPassReverse /
RequestHeader unset Accept-Encoding
ProxyHTMLEnable On
#ProxyHTMLInterp On
ProxyHTMLEvents On
ProxyHTMLExtended On
#SetOutputFilter DEFLATE
#SetOutputFilter INFLATE;proxy-html;DEFLATE
#SetOutputFilter INFLATE;proxy-html;SUBSTITUTE;DEFLATE
#SetOutputFilter proxy-html
#ProxyHTMLBufSize 6000000
#ProxyHTMLMeta On
ProxyHTMLLinks a href
ProxyHTMLLinks area href
ProxyHTMLLinks link href
ProxyHTMLLinks img src longdesc usemap
ProxyHTMLLinks object classid codebase data usemap
ProxyHTMLLinks q cite
ProxyHTMLLinks blockquote cite
ProxyHTMLLinks ins cite
ProxyHTMLLinks del cite
ProxyHTMLLinks form action
ProxyHTMLLinks input src usemap
ProxyHTMLLinks head profile
ProxyHTMLLinks base href
ProxyHTMLLinks script src for
ProxyHTMLLinks frame src longdesc
ProxyHTMLLinks iframe src longdesc
ProxyHTMLLinks body background
ProxyHTMLLinks applet codebase
ProxyHTMLCharsetOut *
ProxyHTMLEvents onclick ondblclick onmousedown onmouseup onmouseover onmousemove onmouseout onkeypress onkeydown onkeyup onfocus onblur onload onunload onsubmit onreset onselect onchange
</Location>