O proxy reverso do Apache para o aplicativo no tomcat com a porta 8080 fornece a URL incorreta no cabeçalho de resposta

2

Eu tenho o servidor Apache (2.2) com configuração abaixo para o proxy reverso para o aplicativo sendo executado no tomcat (6) na porta 8080.

....  
ServerName ext-domain  
ProxyPreserveHost On  
ProxyPass  /myapp http://int-domain:8080/myapp  
ProxyPassReverse /myapp http://int-domain:8080/myapp  
....  

Quando eu acesso abaixo do URL do navegador

"http://ext-domain/myapp"  

Eu recebo abaixo do URL substituído na barra de endereço do navegador.

"http://ext-domain:8080/myapp"  

E o log de acesso do apache diz ...

"GET /myapp HTTP/1.1" 302 421 "-" "Mozilla/5.0"...    

Como evitar essa inserção da porta 8080 no URL de resposta?
Alguém pode ajudar nisso? obrigado.

    
por Mahadev Sawale 30.07.2014 / 12:36

2 respostas

2

Atualize ProxyPassReverse conforme abaixo.

     ProxyPassReverse /myapp http://ext-domain/myapp

Consulte: link

    
por 04.08.2014 / 13:19
1

OK, a resposta antiga está incompleta. O culpado é: ProxyPreserveHost em . Você dificilmente precisa dessa cláusula.

O modelo de configuração inicial deve ser:

....  
ServerName ext-domain  
ProxyPass        /app  http://int-domain:8080/myapp
ProxyPassReverse /app  http://int-domain:8080/myapp
....

A resposta 302 que assusta você é gerada pelo backend . Você disse ao backend o cabeçalho Host: ext-domain , esse é o efeito de ProxyPreserveHost , então o backend quer ser legal e obediente e se ele precisa te redirecionar 302 ele também usa o mesmo ext-domain como um conveniência para você. O Backed sabe em qual porta você se conectou, então ele tenta usar a mesma porta que a conveniência para você. Se não é uma conveniência, então não use ProxyPreserveHost , é a solução mais limpa e menos confusa para o problema. A maioria dos aplicativos (não todos) não exigirá ProxyPreserveHost , mas use os cabeçalhos X-Forwaded-xxx usuais.

O processamento 302 é mais ou menos assim:

  • HTTP 302 http://ext-domain:8080/app/foo é gerado pelo backend
  • O Apache verifica a configuração de qualquer ProxyPassReverse xxx http://ext-domain:8080/app
  • se corresponder, o Apache continua com HTTP 302 xxx/foo ( essa etapa não acontece no seu caso )
  • se xxx não for um URL completo, ele será expandido com os usuais ServerName e semelhantes (por isso, o significado completo de ProxyPassReverse /app42 ... é para o Apache dizer 302 http://ext-domain/app42 )
  • O Apache também sabe que o navegador fala com a porta 80 do Apache para que não direcione um navegador para 8080, a menos que você o informe explicitamente com um ServerName configurado incorretamente.
por 25.11.2016 / 13:42