2011-11-15 16 views
15

Estoy usando mod rewrite para enmascarar la raíz de contexto de mi aplicación. Por ejemplo,¿Debo usar ProxyPassReverse si uso la modificación de mods?

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

El AppCluster se ve así:

<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> 

Qué necesito para utilizar ProxyPassReverse en absoluto? Solía ​​usar porque mi viejo código de servidor web se veía así:

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

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

Respuesta

47

El ProxyPassReverse se utiliza para cambiar las cabeceras enviadas por la aplicación (AppCluster) de Apache, Apache antes de la envía al navegador. Por ejemplo, si la aplicación se encuentra en http://localhost:9013/, e intenta redirigir el navegador a, digamos, /new_location/, responderá con un encabezado de redirección y ubicación de http://localhost:9013/new_location/, y Apache lo tomará y lo enviará al navegador. El problema es que el navegador (suponiendo que esté en otro lugar) luego intenta enviar una solicitud al http://localhost:9013/new_location/, y obtiene un error.

Lo que ProxyPassReverse hace es interceptar esos encabezados, y los reescribe para que coincidan con lo que parece el servidor Apache que está haciendo el proxying. Así que si mi servidor Apache está organizando http://myhost.com/ y yo tenemos una ProxyPass que apunta a /http://localhost:9013/App, si la aplicación sentado en localhost: 9013 devuelve una redirección a http://localhost:9013/App/new_location/, voy a tener que usar ProxyPassReverse de modo que consiga reescrito para http://myhost.com/new_location/ por Apache antes enviando la solicitud de vuelta al navegador.

Si no está emitiendo redirecciones, no va a ser un problema, pero no hace falta tenerlo allí en caso de que se devuelva un redireccionamiento 301/302. En cuanto a mod_rewrite, RewriteRule se aplica a la solicitud que va a la aplicación, y no a la respuesta proveniente de la aplicación. Entonces son eventos mutuamente excluyentes.

+0

Mi proxy pass será el siguiente: ProxyPassReverse/App/directory http: // localhost: 9013/App/directory? –

+0

Creo que lo que tienes es correcto. Aunque he visto a gente usarlo de tal manera que la URL a la derecha es el dominio externo y no el localhost. Mis implementaciones de Jboss usan ProxyPassReverse tal como lo tiene y lo redireccionan muy bien. –

+0

Muy buena explicación sobre ProxyPassReverse y su necesidad. @jon lin ... Gracias –