Нужно ли использовать ProxyPassReverse, если я использую переписывание модов? - PullRequest
16 голосов
/ 15 ноября 2011

Я использую mod rewrite, чтобы замаскировать корень контекста моего приложения. Например,

RewriteRule ^/directory/(.*) balancer://appcluster/directory/$1 [P]

Приложение выглядит так:

<Proxy balancer://appcluster>
BalancerMember http://localhost:8080/App route=app_01 keepalive=On loadfactor=1 ttl=300 min=3 smax=5 max=15

ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On
</Proxy>

Нужно ли вообще использовать ProxyPassReverse? Я использовал его, потому что мой старый код веб-сервера выглядел так:

ProxyPass /App balancer://appcluster lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On

ProxyPassReverse /App http://localhost:9013/App

1 Ответ

49 голосов
/ 15 ноября 2011

ProxyPassReverse используется для изменения заголовков, отправляемых приложением (appcluster) на Apache, прежде чем Apache отправит его в браузер.Например, если приложение находится на http://localhost:9013/, и оно пытается перенаправить браузер, скажем, на /new_location/, то оно ответит перенаправлением и заголовком местоположения http://localhost:9013/new_location/,, и Apache приметэто и отправить его в браузер.Проблема в том, что браузер (при условии, что он где-то еще) затем пытается отправить запрос на http://localhost:9013/new_location/, и получает ошибку.

То, что делает ProxyPassReverse, перехватывает эти заголовки и переписывает их так, чтобы они соответствовали тому, как выглядит сервер Apache, который выполняет прокси.Поэтому, если мой сервер Apache содержит http://myhost.com/ и у меня есть ProxyPass, который указывает / на http://localhost:9013/App,, если приложение, расположенное на локальном хосте: 9013 возвращает перенаправление на http://localhost:9013/App/new_location/,Мне нужно будет использовать ProxyPassReverse, чтобы Apache переписал его в http://myhost.com/new_location/ перед отправкой запроса обратно в браузер.

Если вы не отправляете перенаправления, он не собираетсябыть проблемой, но это не повредит иметь его там в случае, если редирект 301/302 возвращается.Что касается mod_rewrite, RewriteRule применяется к запросу, поступающему в приложение, а не к ответу, поступающему из приложения.Таким образом, они являются взаимоисключающими событиями.

...