** обновлено обходным путем внизу этого ответа **
У меня есть требование, чтобы мое веб-приложение проксировало 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>