在 Apache 中,如何为具有相同 context-root 的不同服务器定义多个 ProxyPass?

在 Apache 中,如何为具有相同 context-root 的不同服务器定义多个 ProxyPass?

** 在本答案底部更新了解决方法 **

我需要我的 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>

相关内容