O proxy reverso do host virtual Apache2 reescreve os links de ativos

3

Eu tenho um aplicativo da web em execução na porta 8080 no 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 com dificuldades para disponibilizá-lo em subdomain.mydomain.com (sem o / app). Eu tentei pela primeira vez

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

e também adicionado

ProxyHTMLURLMap /app/ /

mas ambos não parecem funcionar. A página principal carrega, mas todos os links de javascript e CSS ainda apontam para / app / ... que retorna a página html principal em vez do recurso.

O que estou perdendo? Estou no caminho certo ou há uma maneira completamente diferente (melhor) de conseguir isso?

O aplicativo é um aplicativo da Web Tapestry no Tomcat 7 no Ubuntu 12.04.

Qualquer percepção sobre o desempenho também seria interessante.

    
por martin 27.12.2013 / 00:08

3 respostas

2

ProxyPassReverse funciona apenas em cabeçalhos HTTP (por exemplo, redirecionamentos 301).

Para ativar a reescrita de HTML, você precisa ativá-lo via:

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

No entanto, os aplicativos da Web modernos podem entender facilmente o que está acontecendo a partir da solicitação HTTP feita por proxies reversos e, nesse caso, não é necessário nenhum ajuste adicional no nível do proxy.

Lembre-se de que mod_proxy_html adiciona alguma sobrecarga ao processar essas solicitações.

    
por 04.01.2014 / 12:47
1

A resposta de Giovanni me trouxe 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 o cookie da sessão do meu Tomcat funcionar.

    
por 05.01.2014 / 10:15
0

Seu aplicativo da Web em myip:8080/app provavelmente tem muitos caminhos absolutos em HTML e JS, começando com /app/... , que 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 na guia de rede os arquivos que ainda estão sendo solicitados em /app/... e corrija-os até que funcionem nas duas URLs (/ blah e / app).

O objetivo deve ser que todos os seus links no 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>

Verifique também a tag <base> para obter uma maneira de substituir o URL base padrão.

    
por 04.01.2014 / 21:11