Обратный прокси-сервер apache: как переслать HTTP_HOST прокси-сервера
Для локальной настройки разработки требуется блок в DMZ, и у каждого разработчика есть своя строка в конфигурации apache для прокси. Выглядит примерно так:
ProxyPreserveHost on
ProxyPass /user1/ {user1's IP}
ProxyPassReverse /user1/ {user1's IP}
ProxyPass /user2/ {user2's IP}
ProxyPassReverse /user2/ {user2's IP}
#etc
Наши общедоступные URL становятся {DMZ server}/user1
, {DMZ server}/user2
и т. д . Проблема в том, что на полях разработчика значение $_SERVER['HTTP_HOST']
просто {DMZ server}
без подкаталога пользователя. Желаемое поведение должно иметь /user%/
как настоящее имя хоста.
Я пытался переопределить переменную HOST и некоторые правила перезаписи, но ничего не помогло.
Создание поддоменов не вариант.
Спасибо за любую помощь!
3 ответа
http://httpd.apache.org/docs/2.0/mod/mod_proxy.html, кажется, ответ.
Я собираюсь сделать удар и предложить это:
SetEnvIf Host (.*) custom_host=$1
RequestHeader set X-Custom-Host-Header "%{custom_host}e/%{REQUEST_URI}e/%{QUERY_STRING}e"
Надеемся, что это должно установить заголовок запроса с именем X-Custom-Host-Header, который вы можете затем получить в PHP. Если вы хотите, вы можете попытаться переопределить заголовок хоста, но я не уверен в последствиях этого. Заголовок Host является специальным заголовком HTTP и обычно содержит только часть узла HTTP-запроса, а не полный URL-адрес запроса.
К сожалению, не проверено, но было бы полезно, если бы вы могли более подробно уточнить, что вы ищете.
РЕДАКТИРОВАТЬ, ТРЕТИЙ ОТВЕТ:
Похоже, Apache уже слышал эту жалобу, и решение mod_substitute
, Вы должны использовать его, чтобы переписать все URL-адреса, возвращенные в документе, чтобы вставить/user1/
,
РЕДАКТИРОВАТЬ, ВТОРОЙ ОТВЕТ:
Основываясь на дополнительной информации в ваших комментариях, я бы сказал, что ваша конфигурация Apache на вашем сервере DMZ верна. Вы запрашиваете, чтобы машины разработчика генерировали URL-адреса, включающие их путь к контексту (который является термином J2EE для чего-то аналогичного вашему/user1/
немного). У меня нет опыта работы с PHP, поэтому я не знаю, есть ли у него такая возможность, но быстрый поиск показывает, что это не так.
В противном случае вам придется свернуть собственную функцию, которая преобразует относительный URL-адрес в абсолютный URL-адрес, настроить его так, чтобы он мог добавить что-либо к имени хоста, а затем заставить всех использовать эту функцию исключительно для создания URL-адресов. В этой старой (устаревшей?) Статье о передовых практиках PHP см. Руководство "Как сделать местоположение вашего приложения независимым" для решения связанной с этим проблемы поиска локальных файлов.
ПРЕДЫДУЩИЙ ОТВЕТ: (не работает, вызывает цикл перенаправления)
Я до сих пор не понимаю, что вы пытаетесь сделать или что вы имеете в виду, говоря, что "в приложениях dev работают в основном apache и PHP, для размещения различных приложений", но, как обоснованное предположение, вы пробовали:
ProxyPass /user1/ {user1's IP}/user1/
ProxyPassReverse /user1/ {user1's IP}/user1/
Если бы я настраивал ту среду, которую вы, похоже, хотели бы иметь, я бы хотел $_SERVER['HTTP_HOST']
быть {DMZ server}
на каждом компьютере разработчика, так что среда на компьютере разработчика выглядит (или, по крайней мере, больше похожа) на производственный код на нем.