Как прокси-контекст для другого внутреннего контекста в Apache

Я хотел бы настроить 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 не преобразует Местоположение в http://my-domain.com/myapp/somewhere-else?

2 ответа

У меня была такая же проблема, и я решил ее следующим образом:

По какой-то причине оба пути к контексту должны быть одинаковыми, поэтому я изменил путь к контексту приложения так, чтобы он был одинаковым (обратите внимание на дополнительный символ "/" в passResever)

    ProxyPass               /jira           http://192.168.1.30:8080/jira
    ProxyPassReverse        /jira/          http://192.168.1.30:8080/jira

Ваше местоположение источника /myappв то время как ваш ProxyPassReverse для /myapp/; контекст прокси-местоположения не совпадает, поэтому ProxyPassReverse не применяется

Почему прокси mod_rewrite? Это должно выполнить то же самое и не иметь проблем с последовательной косой чертой:

ProxyPass /myapp http://backend-server:8000
ProxyPassReverse /myapp http://backend-server:8000

Проблема заключается в том, что внутреннее приложение возвращает заголовок Location с публичным именем my-domain.com, поэтому ProxyPassReverse его не распознает. Внутренний сервер не должен знать общедоступное имя (имя внешнего интерфейса), он должен знать себя только под именем "внутренний сервер".

Другие вопросы по тегам