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

Ищу эквивалент ProxyPassReverseMatch в Apache, чтобы исправить проблему отсутствия конечной косой черты

У меня есть два веб-сервера, www.example.com и www.userdir.com. Я пытаюсь сделать www.example.com в качестве прокси-сервера переднего плана для обслуживания запросов, например, в формате http://www.example.com/~username Такие как

http://www.example.com/~john/

так что он отправляет внутренний запрос

http://www.userdir.com/~john/

на www.userdir.com. Я могу добиться этого в Apache с помощью

ProxyPass /~john http://www.userdir.com/~john  
ProxyPassReverse /~john http://www.userdir.com/~john

В ProxyPassReverse необходимо, так как без него запрос вроде http://www.example.com/~john без косой черты в конце будет перенаправлен как http://www.userdir.com/~john/ и я хочу, чтобы мои пользователи оставались в пространстве example.com.

Теперь моя проблема в том, что у меня много пользователей, и я не могу перечислить все эти имена пользователей в httpd.conf. Итак, я использую

ProxyPassMatch ^(/~.*)$ http://www.userdir.com$1

но нет такой вещи как ProxyPassReverseMatch в Apache. Без него, если в URL-адресе отсутствует косая черта в конце, он будет перенаправлен на www.userdir.com, а это не то, что я хочу.

Я также пробовал следующее, чтобы добавить косую черту в конце

RewriteCond %{REQUEST_URI} ^/~[^./]*$  
RewriteRule ^/(.*)$ http://www.userdir.com/$1/ [P]

но затем он отобразит страницу с неработающим изображением и CSS, потому что они связаны с http://www.example.com/images/image.gif пока это должно быть http://www.example.com/~john/images/image.gif.

Я давно гуглил и до сих пор не могу найти для этого хорошего решения. Был бы очень признателен, если бы кто-нибудь мог пролить свет на эту проблему. Спасибо!

Вы можете просто игнорировать имя пользователя и все, что следует, при исправлении перенаправления:

ProxyPassReverse / ~ http://www.userdir.com/~

Поскольку это всего лишь подстановка префикса.

Очень интересный пост, я все пользовательские каталоги на внутреннем сервере и выполнял проксирование на внешнем сервере, это сработало для меня ..

ProxyPassMatch ^(/~.*)$ http://www.backend.com$1
ProxyPassReverse /~ http://www.backend.com/~

Я тестировал это на странице в режиме инкогнито в Chrome, так как Firefox кэшировал данные, поэтому мои тестовые страницы не работали должным образом. Я думаю, чтобы исправить ваши проблемы на странице, вам, возможно, придется использовать mod_proxy_html, как было предложено выше, мне повезло, что на задней панели все css и изображения были в папке с именем media, которой не было на моем внешнем компьютере, поэтому я просто добавил прокси-прокси и вернуться в каталог my / media.

Я не думаю, что вы правильно понимаете функцию директивы ProxyPassReverse. Вот выдержка из документации:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse

Эта директива позволяет Apache настраивать URL-адрес в заголовках Location, Content-Location и URI в ответах перенаправления HTTP. Это важно, когда Apache используется в качестве обратного прокси (или шлюза), чтобы избежать обхода обратного прокси из-за перенаправлений HTTP на внутренних серверах, которые остаются за обратным прокси.

Будут переписаны только заголовки HTTP-ответа, указанные выше. Apache не будет перезаписывать другие заголовки ответов, при этом он не будет перезаписывать URL-ссылки внутри HTML-страниц. Это означает, что если прокси-контент содержит абсолютные URL-ссылки, они будут обходить прокси. Сторонний модуль, который просматривает HTML-код и перезаписывает URL-адреса, - это mod_proxy_html Ника Кью.

Кроме того, вы не хотите автоматически добавлять косую черту к любому URL-адресу - это может привести к разрыву множества ссылок.

Теперь, чтобы заставить конечную косую черту после каталога пользователя, я бы сделал что-то вроде этого:

RewriteRule ^/(~\w+)(/(.+)?)?$ http://www.userdir.com/$1/$3 [P]