Riscrivere 302 Server app ReDirect URL con Apache Proxy nel mezzo


8

Ho una configurazione strana. Sembra così:

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

Sul proxy HTTPS (un proxy molto stupido), arriva un URL simile a https: //proxy.domain.com/app. Viene quindi eseguito il tunneling su Apache utilizzando HTTP come http: //apache.domain.com/app (passando l'host proxy.domain.com). Apache quindi esegue il tunneling della richiesta localmente utilizzando il protocollo AJP per ajp: // localhost: 8009 / app /.

A volte il server delle app desidera reindirizzare il percorso richiesto. Ad esempio, reindirizzare / app / su / app / webapp. Quindi, restituisce un 302 ad Apache reindirizzando il percorso - probabilmente qualcosa come ajp: // localhost: 8009 / app / webapp. Apache quindi riscrive l'URL di reindirizzamento su http: //proxy.domain.com/app/webapp. Il proxy HTTPS è stupido, quindi non analizza il reindirizzamento e cambia il http in https.

Quindi, vorrei capire se posso configurare Apache per riscrivere l'URL di reindirizzamento 302 per inviare l'utente a https.

Ecco la configurazione che ho finora nel https.conf di Apache:

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

Ho provato ad usare ProxyPassReverse , ma non sono riuscito a capire come forzarlo a riscrivere l'URL di reindirizzamento 302 con https anziché http.

qualche idea?

Risposte:


9

Lotto sempre un problema per ore prima di rinunciare e pubblicare una domanda - solo per risolvere il mio problema pochi minuti dopo la pubblicazione ...

Per coloro che sono interessati, la soluzione non è usare ProxyPassReverse , ma piuttosto usare la direttiva Header - ti permette di pasticciare con le intestazioni in uscita. In questo caso, posso acquisire l'intestazione della risposta della posizione ed eseguire una regex su di essa per correggere il protocollo dell'URL:

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

Ecco!

Se apache si lamenta, è possibile che mod_headers non sia ancora abilitato: a2enmod headers


Non è necessario modificare le intestazioni, scegli la soluzione @wondy per far conoscere a Tomcat il protocollo LB / RProxy tramite RempteIpValve
Muhammad Hewedy,

Ho usato questa soluzione. Preferisco di gran lunga fare un po 'di configurazione di Apache piuttosto che far fare a Tomcat quello che voglio!
froderik,

3

Ho trovato un'altra opzione.

Basato su /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat e Apache ReverseProxyPass reindirizza a http anziché https sembra che alcuni server riconoscano l'intestazione X-Forwarded-Protocol . Si può far riconoscere Tomcat aggiungendo:

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

a server.xml.


1
Questa è la soluzione migliore, quindi Tomcat è progettato per funzionare in questo modo
Muhammad Hewedy,

Penso che tu intenda X-Forwarded-Proto.
Michael Hampton,

Sono abbastanza sicuro di aver usato "Protocollo" e ha funzionato. Ma era marzo 2013. Vedo che entrambe le versioni sono state utilizzate per un po 'di tempo. Come vedo intanto è stato scritto un nuovo RFC 7239 (giugno 2014). Probabilmente la versione "Proto" ha vinto ed è lo standard ora.
wodny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.