Reescrevendo 302 URLs de redirecionamento do servidor de aplicativos com o Apache Proxy no meio

8

Eu tenho uma configuração estranha. Se parece com isso:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

No proxy HTTPS (um proxy muito idiota), uma URL aparece como https: //proxy.domain.com/app. Em seguida, é encapsulado no Apache usando HTTP, como é http: //apache.domain.com/app (transmitindo o host proxy.domain.com). O Apache encapsula a solicitação localmente usando o protocolo AJP para ajp: // localhost: 8009 / app /.

Às vezes, o servidor de aplicativos deseja redirecionar o caminho solicitado. Por exemplo, redirecione / app / para / app / webapp. Portanto, ele envia um 302 de volta ao apache, redirecionando o caminho - provavelmente algo como ajp: // localhost: 8009 / app / webapp. O Apache então reescreve o URL de redirecionamento para http: //proxy.domain.com/app/webapp. O proxy HTTPS é burro, por isso não analisa o redirecionamento e altera o http para https.

Portanto, gostaria de descobrir se posso configurar o Apache para reescrever a URL de redirecionamento 302 para enviar o usuário para https.

Aqui está a configuração que eu tenho até agora no https.conf do Apache:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Tentei usar o ProxyPassReverse , mas não consegui descobrir como forçá-lo a reescrever o URL de redirecionamento 302 com https em vez de http.

Alguma ideia?

George
fonte

Respostas:

9

Eu sempre luto com um problema por horas antes de desistir e postar uma pergunta - apenas para resolver meu próprio problema minutos depois de postar ...

Para os interessados, a solução não é usar o ProxyPassReverse , mas usar a diretiva Header - isso permite que você mexa com os cabeçalhos de saída. Nesse caso, posso capturar o cabeçalho de resposta Location e executar uma regex nele para corrigir o protocolo da URL:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Voila!

Se o apache reclamar, pode ser que o mod_headers ainda não esteja ativado: a2enmod headers

George
fonte
Não há necessidade de editar os cabeçalhos, ir para a solução @wondy fazer tomcat saber sobre o protocolo LB / RProxy através RempteIpValve
Muhammad Hewedy
Eu usei essa solução. Eu prefiro fazer algumas configurações do Apache do que fazer o tomcat fazer o que eu quero!
Froderik
3

Eu encontrei outra opção.

Com base em /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat e Apache ReverseProxyPass é redirecionado para http em vez de https , parece que alguns servidores reconhecem o cabeçalho X-Forwarded-Protocol . Pode-se fazer o Tomcat reconhecê-lo adicionando:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

para server.xml.

wodny
fonte
1
Esta é a melhor solução, portanto, o tomcat foi projetado para funcionar dessa maneira #
Muhammad Hewedy
Eu acho que você quer dizer X-Forwarded-Proto.
Michael Hampton
Tenho certeza de que usei "Protocolo" e funcionou. Mas era março de 2013. Vejo que ambas as versões foram usadas há algum tempo. Como posso ver enquanto isso, uma nova RFC 7239 foi escrita (junho de 2014). Provavelmente a versão "Proto" ganhou e é o padrão agora.
Wodny