ubuntuusers.de

Reverse Proxy mit Subdirectories

Status: Ungelöst | Ubuntu-Version: Server 12.04 (Precise Pangolin)
Antworten |

thomsen

Avatar von thomsen

Anmeldungsdatum:
9. Juni 2010

Beiträge: 188

Wohnort: Hamburg

Hallo zusammen,

ich bin gerade dabei meine verschiedenen HTTP Server (mit diversen Anwendungen dahinter) in meinem Heimnetz, welche ich bis dato per NAT über meinen Router ansprach, nun aus diversen Gründen (z.B. um alle über den Standard-HTTPS Port 443 ansprechen zu können) über einen reverse Proxy ansprechen zu wollen. Ergo hab ich mir auf einem Server apache mit mod_rewrite, mod_proxy, mod_proxy_http und mod_proxy_html (wobei ich hoffe letzteres nicht nutzen zu müssen) aufgesetzt, ProxyRequests natürlich ausgeschaltet 😉 und dann angefangen Proxyregeln zu definieren mit dem Ziel über Unterverzeichnisse die Requests auf den Server, welcher die entsprechende Anwendung hostet zu verweisen.

Mein Problem an dieser Stelle ist, dass dies nur für das root-Directory auf dem Proxy korrekt funktioniert. Für Subdirectores werden die Pfade die die Anwendung zurückliefert nicht korrekt aufgelöst, sodass etliche Java-Script Methoden nicht funktionieren und die korrekten CSS und Image Includes auch erst nach Nutzung von mod_proxy_html mit ProxyHTMLURLMap angezogen werden.

So, das klingt jetzt so formuliert sicher erstmal verwirrend, darum jetzt mal mit dem konkreten Fallbeispiel. Hier der wichtige Auszug aus meiner Apache Konfiguration in sites-enabled:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<VirtualHost *:443>
  ServerAdmin admin@...net

  SSLCertificateFile      /etc/ssl/certs/server.crt
  SSLCertificateKeyFile   /etc/ssl/private/server.key
  SSLCertificateChainFile /etc/ssl/certs/intermediate.crt

  SSLProxyEngine On
  RewriteEngine On
  ProxyPreserveHost On

  ProxyPass /file/ https://192.168.0.20:7001/
  ProxyPassReverse /file/ https://192.168.0.20:7001/

  ProxyPass / https://192.168.0.50:5001/
  ProxyPassReverse / https://192.168.0.50:5001/

In beiden Fällen, also wenn ich https://reverseproxy/ oder https://reverseproxy/file/ angebe, werde ich auf den korrekten Server umgeleitet. Unter https://reverseproxy/ funktioniert auch alles tadellos, unter https://reverseproxy/file/ werden jedoch alle Includes nicht korrekt angezogen.

Ich habe erst versucht dies mit mod_proxy_html zu lösen, was dann so aussah:

1
2
3
4
5
6
7
8
ProxyPass /file/ https://192.168.0.20:7001/
ProxyHTMLURLMap https://192.168.0.20:7001 /file
<Location /file/>
  ProxyPassReverse https://192.168.0.20:7001/
  SetOutputFilter INFLATE;proxy-html;DEFLATE
  ProxyHTMLURLMap / /file/
  ProxyHTMLURLMap /file /file
</Location>

Dies führte immerhin dazu, dass die Includes korrekt durchgeführt wurden, jedoch funktionierten etliche Java-Script aufrufe nicht, sodass die Applikation letzten Endes doch unbrauchbar war. Auch mit den Einstellungen ProxyHTMLExtended und ProxyPreserveHost habe ich experimentiert, jedoch ohne Ergebnisse.

Einfach ließe sich dies über zusätzliche Virtual Hosts lösen, die jeweils eine andere Subdomain abfangen. Jedoch habe ich kein gesigntes Zertifikat für diese Subdomains (leider erforderlich) sodass, ich diesen Weg nicht gehen kann.

Gibt es einen anderen Weg, wie ich sicherstellen kann, dass wirklich alle root relative Links (auch in Scripts) unter dem Subdirectory angewandt werden, wenn ich über dies einen Request per ProxyPass route?

Ich bin hier über jeden Tipp dankbar. Wenn ich mich zu unklar ausgedrückt haben sollte oder der Use-Case noch nicht klar ist bitte nachfragen. Danke bereits im Voraus.

Das_Wort

Anmeldungsdatum:
23. Dezember 2009

Beiträge: 5269

Wohnort: /dev/null

Es gibt da das OSS-Projekt PageKite. Kann man auch selbst hosten. Macht das einrichten einfacher. Und jetzt *duck* damit ich nicht getroffen werde, weil ich zum eigentlichen Problem nichts beigetragen habe.

thomsen

(Themenstarter)
Avatar von thomsen

Anmeldungsdatum:
9. Juni 2010

Beiträge: 188

Wohnort: Hamburg

Gut, mit den entsprechenden mod_proxy_html Statements referenziert der "statische" Code der Seiten korrekt auf die geänderte URL. Das Problem liegt in den vielen extern eingebundenen JavaScripts die oft Aufrufe oder Redirects (z.B. nach einem Login) als root relative, also mit führendem '/' angeben.

Gibt es eine Möglichkeit dem hostenenden Webserver den ersten Unterordner als Teil der Serveraddresse mitzugeben?

Sprich dass er, wenn ich https://reverseproxy/file/webman/index.cgi aufrufe, die Applikation auf dem Server, an den alle Aufrufe unter "/file/" weitergeleitet werden den Server Root nicht als "https://reverseproxy" ansehen, sondern als "https://reverseproxy/file", damit eingebundene Scripts, welche z.B. mit "/scripts/sds.js" angegeben sind nicht auf "https://reverseproxy/scripts/sds.js" sondern auf "https://reverseproxy/file/scripts/sds.js" verweisen?

thomsen

(Themenstarter)
Avatar von thomsen

Anmeldungsdatum:
9. Juni 2010

Beiträge: 188

Wohnort: Hamburg

Hallo "Das Wort",

erstmal danke für die Antwort, ich habe mir PageKite auch kurz angeschaut, jedoch wirkt das auf mich nicht so, als ob das das ist, was ich suche. Ich brauche einen Reverse Proxy, um je nach Ordnerstruktur den Request auf von außen nicht zugängliche Server im internen Netz weiterzuleiten. DDNS, Hosting, etc. sind alles nicht die Probleme, bzw. per NAT im Router ist das ja auch alles kein Problem.

thomsen

(Themenstarter)
Avatar von thomsen

Anmeldungsdatum:
9. Juni 2010

Beiträge: 188

Wohnort: Hamburg

Ich bin gerade über Nginx gestolpert, welches nochmal ein Proxy Aufsatz für Apache zu sein scheint. Kennt sich jemand mit Nginx aus und weiß, ob sich mein beschriebenes Problem damit lösen lässt?

Antworten |