Enlaces de activos de reescritura de proxy inverso de host virtual Apache2

Enlaces de activos de reescritura de proxy inverso de host virtual Apache2

Tengo una aplicación web ejecutándose en el puerto 8080 de mi servidor: myip:8080/app

Tengo la siguiente configuración en mi httpd.conf

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass /app http://localhost:8080/app/
 ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>

Esto funciona bien y hace que la aplicación esté disponible en subdominio.midominio.com/app

Ahora estoy luchando para que esté disponible en subdominio.midominio.com (sin la aplicación/). lo intenté por primera vez

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

y también añadido

ProxyHTMLURLMap /app/ /

pero ambos no parecen funcionar. La página principal se carga, pero todos los enlaces de JavaScript y CSS todavía apuntan a /app/... que devuelve la página html principal en lugar del activo.

¿Qué me estoy perdiendo? ¿Estoy en el camino correcto o hay una manera completamente diferente (mejor) de lograrlo?

La aplicación es una aplicación web Tapestry en Tomcat 7 en Ubuntu 12.04.

Cualquier información sobre el rendimiento también sería interesante.

Respuesta1

ProxyPassReversesolo funciona en encabezados HTTP (por ejemplo: redirecciones 301).

Para habilitar la reescritura de HTML, debe habilitarla a través de:

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

Sin embargo, las aplicaciones web modernas pueden comprender fácilmente lo que sucede con la solicitud HTTP realizada por servidores proxy inversos y, en este caso, generalmente no es necesario ningún ajuste adicional a nivel de proxy.

Tenga en cuenta que esto mod_proxy_htmlagrega algunos gastos generales al procesar esas solicitudes.

Respuesta2

La respuesta de Giovanni me llevó por el camino correcto. necesitaba agregar

ProxyHTMLEnable On

o más precisamente (para mi versión de mod_proxy_html) el equivalente

SetOutputFilter INFLATE;proxy-html;DEFLATE

Sin embargo, decidí usarlo en combinación con una reescritura (ya que no pude hacer que los enlaces del evento Tapestry funcionaran de otra manera):

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyRequests Off
 ProxyPreserveHost On
 SetOutputFilter INFLATE;proxy-html;DEFLATE     
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
 ProxyHTMLURLMap /app/ /     
 ProxyPassReverseCookiePath /app /
 RewriteEngine on
 RewriteRule ^/app/(.+) /$1 [R,L]
</VirtualHost>

También necesitaba adaptar la ruta de la cookie ( ProxyPassReverseCookiePath /app /) para que funcionara la cookie de mi sesión de Tomcat.

Respuesta3

Su aplicación web myip:8080/appprobablemente tenga muchas rutas absolutas en HTML y JS, comenzando por /app/...las cuales no todas pueden ser capturadas y reescritas por mod_proxy_html.

Sugeriría intentar primero ejecutar su aplicación en diferentes URL locales como myip:8080/blah. Abra la barra de herramientas de desarrollador de su navegador y verifique en la pestaña de red los archivos que aún se solicitan /app/...y corríjalos hasta que funcionen en ambas URL (/blah y /app).

El objetivo debe ser que todos los enlaces en su aplicación sean relativos, es decir, especificados como

<script type="text/javascript" src="file.js"></script>

en lugar de algo como esto

<script type="text/javascript" src="/app/file.js"></script>

Consulte también el<base>etiqueta para obtener una forma de anular la URL base predeterminada.

información relacionada