Назад | Перейти на главную страницу

В Apache, как определить несколько ProxyPass для разных серверов с одним и тем же корневым контекстом?

** обновлено обходным путем внизу этого ответа **

У меня есть требование, чтобы мое веб-приложение проксировало 2 внешних сервера отчетов. Итак, у меня будет пункт меню для каждого внешнего сервера отчетов.

Но URL-адрес браузера слишком похож на мой сервер, поэтому я не могу просто перенаправить. оба этих сервера имеют один и тот же контекстный корень / ibm

URL-адрес браузера для обоих серверов должен выглядеть так: http://example.com/ibm.. пока apache прокси на правильный.

Как следует сделать такую ​​настройку? Как Apache может узнать, к какому из них он должен подключаться?

Я бы не стал своим, если бы мне пришлось внести некоторые изменения, чтобы URL-адрес выглядел так:

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

Мне удалось добиться желаемого эффекта с помощью сервлета weblogic-proxy и манипулирования URL-адресами и т. Д., Но Apache был бы более эффективным решением, если бы это можно было как-то сделать.

Я ценю любой вклад.

Кроме того, исходный запрос к внешним серверам отчетов запускается из моего веб-приложения, а не из браузера.

** Обновить **

Теперь нам нужно проксировать около 10 других веб-серверов, на некоторых из которых возникла эта проблема. Но всякий раз, когда целевой веб-сервер развертывался в корне, нам также приходилось переписывать тело и т. Д., Что для некоторых из этих интеграций с прокси было большим количеством проб и ошибок.

Обходное решение: мы переключились на субдомены для этих проксированных веб-серверов, где на самом деле URL-адрес субдомена по-прежнему указывает на наш собственный apache, но, используя эти имена субдоменов, мы можем более легко настроить виртуальный хост и прокси в нашей конфигурации Apache, и нам не нужно переписывать какие-либо тела ответа и т. д.

Это легко сделать с помощью 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

Больше информации на сайт документации apache для mod_proxy.

Если вам нужно изменить ссылки в контенте, возвращаемом с внешних сайтов, вы можете сделать это с помощью 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>

Я могу сделать это сейчас, используя комбинацию 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>