Как правильно обрабатывать относительные URL с помощью обратного прокси
У меня есть обратный прокси-сервер настройки в Apache следующим образом:
Сервер A с адресом www.example.com/folder является обратным прокси-сервером.
Он сопоставляется с: Сервер B с адресом test.madeupurl.com
Этот вид работ. Но у меня проблема в том, что на www.example.com/folder все относительные ссылки имеют форму www.example.com/css/examplefilename.css, а не www.example.com/folder/css/examplefilename. CSS
Как это исправить?
Пока мой обратный прокси-сервер имеет это на сервере A (www.example.com):
<Location /folder>
ProxyPass http://test.madeupurl.com
ProxyPassReverse http://test.madeupurl.com
</Location>
3 ответа
Apache ProxyPassRewrite не переписывает тела ответов, полученные с http://test.example.com/, а только заголовки (например, перенаправления на страницу 404 и т. Д.).
Ряд альтернатив:
Один) Перепишите внутреннее приложение, чтобы использовать относительные пути вместо абсолютных. т.е. ../css/style.css
вместо /css/style.css
2) Повторно разверните внутреннее приложение в том же подкаталоге. /folder
а не в корне test.example.com.
Три) Один и два часто маловероятны... Если вам повезло, внутреннее приложение использует только два или три подкаталога, и они не используются на вашем основном сайте, просто напишите несколько строк ProxyPass:
# Expose Internal App to the internet.
ProxyPass /externalpath/ http://test.example.com/
ProxyPassReverse /externalpath/ http://test.example.com/
# Internal app uses a bunch of absolute paths.
ProxyPass /css/ http://test.example.com/css/
ProxyPassReverse /css/ http://test.example.com/css/
ProxyPass /icons/ http://test.example.com/icons/
ProxyPassReverse /icons/ http://test.example.com/icons/
Четыре) Создайте отдельный поддомен для внутреннего приложения и просто переверните все прокси:
<VirtualHost *:80>
ServerName app.example.com/
# Expose Internal App to the internet.
ProxyPass / http://test.internal.example.com/
ProxyPassReverse / http://test.internal.example.com/
</VirtualHost>
Пять) Иногда разработчики совершенно не знают, что их приложения не только генерируют абсолютные URL-адреса, но даже включают часть имени хоста в свои URL-адреса, и полученный HTML-код выглядит следующим образом: <img src=http://test.example.com/icons/logo.png>
,
A) Вы можете использовать комбинированное решение DNS с разделением горизонта и сценария 4. Как внутренние, так и внешние пользователи используют test.example.com, но ваш внутренний DNS указывает непосредственно на ip-адрес сервера test.example.com. Для внешних пользователей общедоступная запись test.example.com указывает на IP-адрес вашего общедоступного веб-сервера www.example.com, и вы можете использовать решение 4.
B) На самом деле вы можете заставить apache не только запрашивать прокси на test.example.com, но и переписать тело ответа, прежде чем оно будет передано вашим пользователям. (Обычно прокси переписывает только HTTP заголовки / ответы). mod_substitute в apache 2.2. Я не проверял, хорошо ли он сочетается с mod_proxy, но, возможно, работает следующее:
<Location /folder/>
ProxyPass http://test.example.com/
ProxyPassReverse http://test.example.com/
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|test.example.com/|www.example.com/folder/|i"
</Location>
В дополнение к HBruijn, если вы выбираете решение (3) "ProxyPass", вам, возможно, придется также использовать mod_proxy_html, чтобы переписать некоторые URL-адреса на ваших HTML-страницах.
ср Как правильно обрабатывать относительные URL с помощью обратного прокси-сервера для некоторых примеров.
В качестве прикладного примера, вот как вы можете настроить Apache, используя ProxyHTMLURLMap
Правило для перенаправления всего на your-domain-name.com/pad на ваш экземпляр Etherpad, работающий локально на порту 9001:
<Location /pad>
ProxyPass http://localhost:9001 retry=0
# retry=0 => avoid 503's when restarting etherpad-lite
ProxyPassReverse http://localhost:9001
SetOutputFilter proxy-html
ProxyHTMLURLMap http://localhost:9001
</Location>
RewriteRule ^/pad$ /pad/ [R]
Вы можете использовать следующий способ сделать обратный прокси:
1. Установите mod_proxy_html
yum install mod_proxy_html
Загрузить модуль mod_proxy_html
LoadModule proxy_html_module modules/mod_proxy_html.so
И используйте следующие настройки
ProxyRequests off ProxyPass /folder/ http://test.madeupurl.com ProxyHTMLURLMap http://test.madeupurl.com /folder <Location /folder/> ProxyPassReverse / ProxyHTMLEnable On ProxyHTMLURLMap / /folder/ RequestHeader unset Accept-Encoding </Location>
Надеюсь, это поможет.