web-dev-qa-db-ja.com

Apacheで、同じコンテキストルートを持つ異なるサーバーに複数のProxyPassを定義するにはどうすればよいですか?

**この回答の下部にある回避策で更新されました**

私のWebアプリケーションは2つの外部レポートサーバーにプロキシする必要があります。したがって、外部レポートサーバーごとにメニュー項目を用意します。

しかし、ブラウザーのURLはサーバーのように見えるため、リダイレクトすることはできません。これらのサーバーは両方とも同じcontext-root/ibmを持っています

どちらのサーバーでも、ブラウザのURLは http://example.com/ibm ..のようになりますが、Apacheは正しいサーバーにプロキシします。

このような設定はどのように行う必要がありますか? Apacheはどのようにプロキシする必要があるかをどのようにして知ることができますか?

URLが次のようになるように変更を加える必要がある場合、私は採掘しません。

http://example.com/rep1/ibm and http://example.com/rep2/ibm

私はなんとかweblogic-proxyサーブレットを使用してURLなどを操作することで目的の効果を得ることができましたが、これが何らかの方法で可能であれば、Apacheがより効率的なソリューションになります。

私はどんな入力にも感謝します。

また、外部レポートサーバーへの最初のリクエストは、ブラウザーからではなく、私のWebアプリから起動されます。

**更新**

現在、この問題が発生した他の約10のWebサーバーにプロキシする必要があります。しかし、ターゲットのWebサーバーがルートにデプロイされたときはいつでも、本体などを書き換える必要がありました。これらのプロキシ統合の一部では、これは多くの試行錯誤でした。

回避策:これらのプロキシされたウェブサーバーのサブドメインに切り替えましたが、実際にはサブドメインのURLは引き続き独自のApacheを指していますが、これらのサブドメイン名を使用すると、Apache構成で仮想ホストとプロキシをより簡単に設定できます。レスポンスボディなどを書き換える必要はありません。

4
gotjee

これは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>
5
Jenny D

リバースプロキシのmod_proxyと、返されたコンテンツを書き換えるためのProxyHTMLURLMapとのmod_proxy_htmlの組み合わせを使用して、これを実行できます。最初のページは正常に読み込まれ、すべてのURLなどが書き換えられます。それらにカーソルを合わせると、rep1プレフィックスが表示されます。

しかし、プロキシされたアプリケーションのメニューの1つをクリックすると、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>
0
gotjee