Lösung für das Reverse Proxying auf URLs, die nicht in ein Unterverzeichnis verschoben werden können

7

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?

  1. 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.
  2. 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.
Tom H.
quelle
mod_substitute ist jetzt ein Standardmodul, also mache ich damit spontan eine Neuzuordnung.
Tom H
Hallo Tom, wir haben hier eine vergleichbare Situation und nach einigen Tests mit Nginx verwenden wir jetzt Varnish dafür. Der Reverse Proxy ist mehr oder weniger ein Gateway zu verschiedenen Back-End-Systemen. Wir führen die Differenzierung anhand der Anforderungs-URL durch. Wir schreiben jedoch keine URLs neu.
Jens Bradler
Übrigens: Wir hatten ähnliche Probleme mit Logstash 1.0.9, aber 1.1.13 scheint diese Probleme behoben zu haben und verwendet nur relative Links.
Hans-Peter Störr

Antworten:

1

mod_substitute macht den Job sehr gut;

Zusammenfassung: mod_substitute bietet einen Mechanismus zum Ausführen von Substitutionen mit regulären Ausdrücken und festen Zeichenfolgen für Antwortkörper.

Das Durcharbeiten der Zuordnungsregeln dauert nur ein wenig.

Tom H.
quelle