Kurzgeschichte
Gah! Ich wünschte, die Entwickler, die Administratoroberflächen erstellt haben, würden eine Option "webroot = / myAppAppearsHere" verfügbar machen oder alle Links relativ machen.
Lange Geschichte
Ich habe ein Admin-Portal für einen Kunden, bei dem es sich im Grunde um ein Apache mod_auth-Login handelt, und dann um eine Reihe von Links zu solchen Back-End-Admin-Seiten.
https://portal.mysite.com/login
https://portal.mysite.com/
und dann ein paar Links wie diese
https://portal.mysite.com/monitoring -> https://nagios.localdomain/nagios
https://portal.mysite.com/munin -> https://munin.localdomain/nagios
https://portal.mysite.com/bacukups -> https://backups.localdomain/backups
Es gibt jedoch einige Anwendungen, die wirklich nicht zufrieden sind, wenn sie in ein Unterverzeichnis umgekehrt werden, z. B. chef-server-webui und die Logstash-Weboberfläche.
ProxyPassReverse ordnet die Header neu zu, aber alle internen absoluten URLs müssen geändert werden. Wenn in der App-Konfiguration keine Option dafür vorhanden ist, muss dies in die HTML-Antwort übernommen werden.
Die naheliegende Taktik besteht darin, Subdomains oder Wildcard-Subdomains zu erstellen, um diese Apps wie folgt zuzuordnen.
https://chef.mysite.com/ -> https://chefserver.localdomain:4040/
https://logstash.mysite.com/ -> https://logstash.localdomain/
https://*.mysite.com/ -> https://($1).localdomain/
Leider habe ich keine Kontrolle über die Verwaltung der Domain, und es ist nur ein Schmerz, diese Ergänzungen zu erhalten. (aber ich würde eine Lösung bevorzugen, bei der nicht für jeden neuen Link ein Dritter beteiligt sein muss) (Ich bin mir bewusst, dass ein Platzhalter dies lösen würde, aber ich bin daran interessiert zu sehen, welche HTTP- und Apache-basierten Alternativen es gibt. .. zum Lernen etc ;-)
Daher habe ich Apache2 :: ModProxyPerlHtml verwendet, das mod_proxy_html ähnelt und die dynamische Neuzuordnung von Zeichenfolgen in den Dokumenten ermöglicht. Dies funktioniert tatsächlich mit einer Kombination aus LocationMatch und ProxyHTMLRewrite. Ich kann sogar das Javascript zum Spielen bringen. Es ist jedoch ein gewaltiger Schmerz, jeden einzelnen zu tun, insbesondere für alle Nicht-Web 1.0-Apps.
Zum Beispiel behebt das Folgende fast logstash, damit es unter / logstash korrekt funktioniert.
<LocationMatch "^/logstash/">
RequestHeader unset Accept-Encoding
PerlSetVar ProxyHTMLVerbose "On"
PerlInputFilterHandler Apache2::ModProxyPerlHtml
PerlOutputFilterHandler Apache2::ModProxyPerlHtml
SetHandler perl-script
PerlAddVar ProxyHTMLRewrite "/style.css /logstash/style.css"
PerlAddVar ProxyHTMLRewrite "/css/smoothness/jquery-ui-1.8.5.custom.css /logstash/css/smoothness/jquery-ui-1.8.5.custom.css"
PerlAddVar ProxyHTMLRewrite "/js/jquery-1.6.1.min.js /logstash/js/jquery-1.6.1.min.js"
PerlAddVar ProxyHTMLRewrite "action='/search' action='/logstash/search'"
PerlAddVar ProxyHTMLRewrite "/js/jquery-ui-1.8.13.min.js /logstash/js/jquery-ui-1.8.13.min.js"
PerlAddVar ProxyHTMLRewrite "/media/throbber.gif /logstash/media/throbber.gif"
PerlAddVar ProxyHTMLRewrite "/api/search /logstash/api/search"
PerlAddVar ProxyHTMLRewrite "/api/histogram /logstash/api/histogram"
</LocationMatch>
Aber es ist ein Hit und Miss, und Sie können den URL-Swap nicht einfach mit einem Platzhalter versehen, da es eine Menge JSON und Javascript gibt, die entstellt werden.
Ich dachte an eine Art Cookie oder Querystring-Variable, die das aktuelle Proxy-Backend verfolgte, damit Apache die Anfrage dynamisch auf das richtige Backend umleiten konnte.
https://admin.mysite.com/?request-proxy=chef -> https://chefserver.localdomain:4040/
https://admin.mysite.com/?request-proxy=logstash -> https://logstash.localdomain/
Und im Grunde genommen könnte Apache, wenn es den letzten Blick auf den gesamten HTTP-Inhalt des Servers erhält, URLs dynamisch mit der zusätzlichen Abfrage vars & request-proxy = logstash kennzeichnen. Ich denke jedoch, dass dies unter dem gleichen Problem wie die ModProxyPerlHtml / mod_proxy_html-Lösung leiden würde, da es niemals überall funktionieren würde, insbesondere in Apps, in denen Javascript verwendet wurde, um mit der Client-Seite von QUERY params zu wackeln.
Ich denke, ein Cookie würde fast funktionieren, da Sie Proxy basierend auf einem übergebenen Cookie-Wert "request-proxy = logstash" sagen könnten. Dies würde jedoch ein Problem verursachen, wenn Sie 2 Registerkarten für die Site geöffnet hätten, da diese wahrscheinlich jeweils überschreiben würden andere Cookies.
Ich weiß, dass einige Apps nur einen Brute-Force-Ansatz verfolgen und die gesamte Proxy-Anfrage in neu gebackenes HTML wie den Netscreen SA-3000 einbinden .
Wie auch immer, gibt es Apache-Module, die eine dieser Strategien implementieren, oder irgendwie einen Nebenschritt, der Übereinstimmungsregeln für jede Proxy-Site schreibt?
- ps Ich bin mir der Zitrone bewusst, aber ich bin nicht weit gekommen, ohne in den Perl-Code eintauchen zu müssen. Obwohl es cool aussieht und ich in Zukunft einen anderen Blick darauf werfen werde.
- Ich fange an zu vermuten, dass ich zeitlich genauso gut die Zeit damit verbringen könnte, diese HTML-Seiten mit ModProxyPerlHtml neu zuzuordnen, da es keine einheitliche Lösung gibt.