Я бы хотел настроить apache так, чтобы http://my-domain.com/myapp обслуживает веб-приложение Python, работающее в CherryPy на внутреннем сервере.
Вот что в vhost:
RewriteRule ^/myapp/?(.*) http://backend-server:8000/$1 [P]
ProxyPassReverse /myapp/ http://backend-server:8000/
Когда я отслеживаю запрос / ответ, я вижу:
GET /myapp HTTP/1.1
Host: my-domain.com
А потом:
HTTP/1.1 303 See Other
Date: Thu, 15 Sep 2011 21:46:35 GMT
Server: CherryPy/3.1.2
Content-Type: text/html;charset=utf-8
Location: http://my-domain.com/somwhere-else/
Как видите, веб-приложение CherryPy отправляет 303 редирект в / где-то еще /
Любые идеи, почему Apache ProxyPassReverse не преобразует Location в http://my-domain.com/myapp/somewhere-else
?
Ваше исходное местоположение /myapp
, а твой ProxyPassReverse
для /myapp/
; контекст проксируемого местоположения не совпадает, поэтому ProxyPassReverse
не применяется.
Почему прокси mod_rewrite? Это должно дать то же самое и не иметь проблем с согласованностью завершающей косой черты:
ProxyPass /myapp http://backend-server:8000
ProxyPassReverse /myapp http://backend-server:8000
У меня была такая же проблема, и я исправил ее следующим образом:
По какой-то причине оба пути контекста должны быть одинаковыми, поэтому я изменяю свой путь контекста приложения, чтобы он был равным (обратите внимание на дополнительный "/" в passResever)
ProxyPass /jira http://192.168.1.30:8080/jira
ProxyPassReverse /jira/ http://192.168.1.30:8080/jira
Проблема в том, что серверное приложение возвращает заголовок Location с публичным именем «my-domain.com», поэтому ProxyPassReverse не распознает его. Внутренний сервер не должен знать публичное имя (имя внешнего интерфейса), он должен знать себя только по имени «backend-server».