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

apache mod_proxy или mod_rewrite для скрытия корня веб-сервера за путем

У меня есть 2 apache 2.2.21, один внешний и один внутренний, мне нужно сопоставить внутренний apache за путем во внешнем apache, но у меня есть проблемы с абсолютным URL-адресом.

Я пробовал эти конфигурации:

RewriteEngine  on
RewriteRule    ^/externalpath/(.*)$  http://internal-apache.test.com/$1  [L,P,QSA]
ProxyPassReverse /externalpath/ http://internal-apache.test.com/

или

<Location /externalpath/>
  ProxyPass http://internal-apache.test.com/
  ProxyPassReverse http://internal-apache.test.com/
</Location>

Мой внутренний apache использует абсолютный путь для ресурсов поиска, таких как изображения, css и html, и сейчас я не могу его изменить.

Некоторые предложения? Спасибо

Ряд альтернатив:

Один) Перепишите внутреннее приложение, чтобы использовать относительные пути вместо абсолютных.

Два) Повторно разверните внутреннее приложение в подкаталоге, а не в корне вашего внутреннего apache.

Три) Один и два часто маловероятны ... Если вам повезло, внутреннее приложение использует только два или три подкаталога, и они не используются на вашем основном сайте, просто напишите несколько строк ProxyPass:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://internal-apache.test.com/
ProxyPassReverse /externalpath/  http://internal-apache.test.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://internal-apache.test.com/css/
ProxyPassReverse /css/  http://internal-apache.test.com/css/
ProxyPass /icons/  http://internal-apache.test.com/icons/
ProxyPassReverse /icons/  http://internal-apache.test.com/icons/

Четыре) Создайте отдельный поддомен для внутреннего приложения и просто отмените все прокси:

<VirtualHost *:80>
   ServerName app.test.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://internal-apache.test.com/
   ProxyPassReverse /  http://internal-apache.test.com/
</VirtualHost>

ПятьИногда разработчики совершенно невежественны и заставляют свои приложения не только генерировать абсолютные URL-адреса, но даже включать часть имени хоста в свои URL-адреса, и результирующий HTML-код выглядит так: <img src=http://internal-apache.test.com/icons/logo.png>.

А) Вы можете использовать комбинированное решение DNS с разделенным горизонтом и сценарий 4. И внутренние, и внешние пользователи используют адрес internal-apache.test.com, но ваш внутренний DNS указывает непосредственно на IP-адрес internal-apache.test.com. сервер. Для внешних пользователей общедоступная запись для internal-apache.test.com указывает на IP-адрес вашего общедоступного веб-сервера, и затем вы можете использовать решение 4.

BФактически, вы можете получить apache не только для прокси-запросов к вашему внутреннему apache, но также переписать тело ответа, прежде чем оно будет передано вашим пользователям. (Обычно прокси перезаписывает только заголовки / ответы HTTP). mod_substitute в apache 2.2. Я не проверял, хорошо ли он сочетается с mod_proxy, но, возможно, работает следующее:

<Location /externalpath/>
  ProxyPass http://internal-apache.test.com/
  ProxyPassReverse http://internal-apache.test.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|internal-apache.test.com/|public-apache.test.com/externalpath/|i" 
</Location>