2012-04-14 4 views
1

Для нашей локальной установки разработки требуется поле в DMZ, и каждый разработчик имеет строку в своей конфигурации apache для проксирования. Похоже что-то вроде:apache обратный прокси: как перенаправить прокси-сервер HTTP_HOST

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 var и некоторые правила перезаписи, но ничего не сработало.

Создание субдоменов не является вариантом.

благодарим за любую помощь!

+0

$ _SERVER ['HTTP_HOST'] в любом случае покажет имя хоста или IP-адрес. Вам нужно использовать $ _SERVER ['REQUEST_URI'] или что-то подобное, чтобы получить полный путь. –

+0

Поверьте мне, я просмотрел все $ _SERVER за правильное значение. Besies, я бы предпочел не запускать все проекты, которые я запускаю, и изменить код. Фундаменты PHP, которые мы используем, также зависят от HTTP_HOST. – Ethan

+0

Итак, если я правильно понял вопрос, желание состоит в том, чтобы {DMZ_SERVER}/пользователь% прошел через бэкэнд-приложения? – groodt

ответ

1

Im собирается принять удар и предложить это:

SetEnvIf Host (.*) custom_host=$1 
RequestHeader set X-Custom-Host-Header "%{custom_host}e/%{REQUEST_URI}e/%{QUERY_STRING}e" 

Это следует надеяться, установить заголовок запроса под названием X-заказ-Host-заголовок, который затем можно пикап в PHP. Если вы хотите, вы можете попробовать переопределить заголовок хоста, но я не уверен в последствиях этого. Заголовок хоста является специальным HTTP-заголовком и обычно содержит только часть хоста HTTP-запроса, а не полный URL-адрес запроса.

Непривязанный к сожалению, но это поможет, если вы сможете уточнить в деталях, что вы ищете.

+0

К сожалению, я не могу пройти через весь код, заменяющий экземпляры «HTTP_HOST», «SERVER_NAME», «SCRIPT_URI» и т. Д. – Ethan

0

EDIT, ТРЕТИЙ ОТВЕТ:

Похоже, Apache услышал эту жалобу и решение mod_substitute. Вы должны использовать его для перезаписи всех URL-адресов, возвращенных в документе, для вставки /user1/.

EDIT, ВТОРОЙ ОТВЕТ:

на основе дополнительной информации в комментариях, я бы сказал, что ваш Apache конфигурации на вашем сервере DMZ правильно. То, о чем вы просите, это заставить машины-разработчики генерировать URL-адреса, содержащие их контекстный путь (который является термином J2EE для чего-то аналогичного вашему /user1/ бит). У меня нет опыта работы с PHP, поэтому я не знаю, есть ли у него такое средство, но быстрый поиск suggests it does not.

В противном случае вам нужно будет свернуть свою собственную функцию, которая преобразует относительный URL-адрес в абсолютный URL-адрес, сделайте это настраиваемым, чтобы вы могли добавить что-то к имени хоста, а затем заставить всех использовать эту функцию исключительно для генерирование URL-адресов. См., Например, «Независимо от местоположения вашего приложения» в this old (outdated?) PHP best practices article для решения связанной проблемы поиска локальных файлов.

ПРЕДЫДУЩИЙ ОТВЕТ: (не работает, причины перенаправления петли)

Я до сих пор не ясно, что вы пытаетесь сделать, или то, что вы имеете в виду под «Бегущая по Дев приложений являются Apache и PHP в основном, для размещения различных приложений», но, как догадка, вы пробовали:

ProxyPass /user1/ {user1's IP}/user1/ 
ProxyPassReverse /user1/ {user1's IP}/user1/ 

Если я настраивал роды среды вы, кажется, хотят иметь, я бы хотел $_SERVER['HTTP_HOST'] быть {DMZ server} на каждый dev так, чтобы среда dev-машины выглядела так же, как (или, по крайней мере, больше), для кода, работающего на Это.

+0

Это на самом деле приводит к циклу перенаправления для меня. – Ethan

+0

Цель состоит в том, чтобы иметь уникальный, общедоступный URL-адрес для каждого разработчика, который правильно пересылает их на свою машину. Это действительно так. Когда PHP должен построить URL (например, для изображения), он использует $ _SERVER ['SERVER_NAME'] или 'HTTP_HOST', что в этом случае неверно. Думаю, субдомены были бы идеальными. – Ethan

+0

@ Ethan, субдомены были бы идеальными. То, что вы делаете, легко в J2EE, потому что оно имеет концепцию контекста приложения, и вы создаете URL-адреса не по отношению к имени хоста, а по отношению к контексту, который в вашем случае будет именем хоста плюс '/ user1 /'. Я не знаю, как настроены PHP-серверы и приложения. В принципе, я бы написал функцию, которая преобразует относительный URL-адрес в абсолютный URL-адрес, настраивает его таким образом, чтобы вы могли добавить что-то к имени хоста, а затем заставить всех использовать эту функцию исключительно для генерации URL-адресов. –