Нужно ли использовать ProxyPassReverse, если я использую mod rewrite?

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

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

Appcluster выглядит так:

<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

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, если приложение, сидящее на localhost: 9013, возвращает перенаправление на http://localhost:9013/App/new_location/, Мне нужно будет использовать ProxyPassReverse, чтобы он переписывался в http://myhost.com/new_location/ от Apache до отправки запроса обратно в браузер.

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