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
ProxyPassReverse
solo 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_html
agrega 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/app
probablemente 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.