Réécriture des URL ReDirect 302 App Server avec le proxy Apache au milieu

8

J'ai une configuration étrange. Cela ressemble à ceci:

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

Sur le proxy HTTPS (un proxy très stupide), une URL ressemble à https: //proxy.domain.com/app. Il est ensuite tunnelé vers Apache en utilisant HTTP comme http: //apache.domain.com/app (en passant dans l'hôte proxy.domain.com). Apache tunnelise ensuite la requête localement en utilisant le protocole AJP pour ajp: // localhost: 8009 / app /.

Parfois, le serveur d'applications souhaite rediriger le chemin demandé. Par exemple, redirigez / app / vers / app / webapp. Ainsi, il renvoie un 302 à apache redirigeant le chemin - probablement quelque chose comme ajp: // localhost: 8009 / app / webapp. Apache réécrit ensuite l'URL de redirection vers http: //proxy.domain.com/app/webapp. Le proxy HTTPS est stupide, il n'analyse donc pas la redirection et ne modifie pas le http en https.

Donc, je voudrais savoir si je peux configurer Apache pour réécrire l'URL de redirection 302 pour envoyer l'utilisateur à https.

Voici la configuration que j'ai jusqu'à présent dans le https.conf d'Apache:

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

J'ai essayé d'utiliser ProxyPassReverse , mais je n'ai pas réussi à le forcer à réécrire l'URL de redirection 302 avec https au lieu de http.

Des pensées?

George
la source

Réponses:

9

Je lutte toujours avec un problème pendant des heures avant d'abandonner et de poster une question - seulement pour résoudre mon propre problème quelques minutes après avoir posté ...

Pour ceux qui sont intéressés, la solution n'est pas d'utiliser ProxyPassReverse , mais plutôt d'utiliser la directive Header - cela vous permet de jouer avec les en-têtes sortants. Dans ce cas, je peux capturer l'en-tête de réponse de localisation et y exécuter une expression régulière pour corriger le protocole de l'URL:

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

Voila!

Si apache se plaint, il se peut que mod_headers ne soit pas encore activé: a2enmod headers

George
la source
Pas besoin de modifier les en-têtes, optez pour la solution @wondy pour faire connaître à Tomcat le protocole LB / RProxy via RempteIpValve
Muhammad Hewedy
J'ai utilisé cette solution. Je préfère de loin faire une configuration Apache plutôt que de faire faire à Tomcat ce que je veux!
froderik
3

J'ai trouvé une autre option.

Basé sur /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat et Apache ReverseProxyPass redirige vers http plutôt que https, il semble que certains serveurs reconnaissent l'en-tête X-Forwarded-Protocol . On peut faire reconnaître Tomcat en ajoutant:

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

à server.xml.

idiot
la source
1
C'est la meilleure solution, donc tomcat est conçu pour fonctionner de cette façon
Muhammad Hewedy
Je pense que tu veux dire X-Forwarded-Proto.
Michael Hampton
Je suis sûr d'avoir utilisé "Protocol" et cela a fonctionné. Mais c'était en mars 2013. Je vois que les deux versions sont utilisées depuis un certain temps. Comme je peux le voir entre-temps, un nouveau RFC 7239 a été écrit (juin 2014). Probablement la version "Proto" a gagné et est maintenant la norme.
wodny