Tenho uma aplicação web em execução na porta 8080 do meu servidor: myip:8080/app
Eu tenho a seguinte configuração no meu httpd.conf
<VirtualHost *:80>
ServerName subdomain.mydomain.com
ServerAlias mydomain.com
ProxyPass /app http://localhost:8080/app/
ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>
Isso funciona bem e disponibiliza o aplicativo em subdomain.mydomain.com/app
Agora estou lutando para disponibilizá-lo em subdomain.mydomain.com (sem o/app). Eu tentei primeiro
<VirtualHost *:80>
ServerName subdomain.mydomain.com
ServerAlias mydomain.com
ProxyPass / http://localhost:8080/app/
ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>
e também adicionou
ProxyHTMLURLMap /app/ /
mas ambos não parecem funcionar. A página principal é carregada, mas todos os links javascript e CSS ainda apontam para /app/... que retorna a página html principal em vez do ativo.
o que estou perdendo? Estou no caminho certo ou existe uma maneira completamente diferente (melhor) de conseguir isso?
O aplicativo é um aplicativo da web Tapestry no Tomcat 7 no Ubuntu 12.04.
Qualquer visão sobre o desempenho também seria interessante.
Responder1
ProxyPassReverse
funciona apenas em cabeçalhos HTTP (por exemplo: redirecionamentos 301).
Para ativar a reescrita de HTML, você precisa habilitá-la por meio de:
ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /
No entanto, os aplicativos da Web modernos podem entender facilmente o que está acontecendo com a solicitação HTTP feita por proxies reversos, e nenhum ajuste adicional no nível do proxy geralmente é necessário nesse caso.
Lembre-se de que isso mod_proxy_html
adiciona alguma sobrecarga no processamento dessas solicitações.
Responder2
A resposta de Giovanni me colocou no caminho certo. eu precisava adicionar
ProxyHTMLEnable On
ou mais precisamente (para minha versão do mod_proxy_html) o equivalente
SetOutputFilter INFLATE;proxy-html;DEFLATE
No entanto, decidi usá-lo em combinação com uma reescrita (já que não consegui fazer com que os links do evento Tapestry funcionassem de outra maneira):
<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>
Também precisei adaptar o caminho do cookie ( ProxyPassReverseCookiePath /app /
) para que meu cookie de sessão do Tomcat funcionasse.
Responder3
Seu aplicativo da web myip:8080/app
provavelmente tem muitos caminhos absolutos em HTML e JS, começando com /app/...
os quais não podem ser capturados e reescritos por mod_proxy_html
.
Sugiro que você primeiro tente executar seu aplicativo em URLs locais diferentes, como myip:8080/blah
. Abra a barra de ferramentas do desenvolvedor do seu navegador e verifique a guia de rede em busca de arquivos que ainda estão sendo solicitados /app/...
e corrija-os até que funcionem em ambos os URLs (/blah e /app).
O objetivo deve ser que todos os links do seu aplicativo sejam relativos, ou seja, especificados como
<script type="text/javascript" src="file.js"></script>
em vez de algo assim
<script type="text/javascript" src="/app/file.js"></script>
Confira também o<base>
tag para obter uma maneira de substituir o URL base padrão.