Seit einiger Zeit betreiben wir ein Code Repository mit Subversion. Da es für SVN ein Apache-Module gibt, das mit Hilfe von WebDAV einen externen Zugriff ermöglicht, nutzen wir diesen Service via HTTPS für unterwegs oder im Home-Office.
Sehr bald mussten wir jedoch feststellen, daß wir bei SVN- bzw. WebDAV-MOVE- und -COPY-Operationen die Fehlermeldung "502 bad gateway" erhielten.
Recht schnell konnten wir überprüfen, dass die erforderliche SSL-Engine für das HTTPS-Protokoll bei Apache aktiviert war und probierten einige Varianten mit verschiedenen Apache- und Subversion-Versionen aus - jedoch ohne Erfolg.
Das Problem musste also mit hoher Wahrscheinlichkeit mit unserer Server-Infrastruktur zusammenhängen.
Nahezu alle externen Zugriffe erfolgen bei uns aus Sicherheitsgründen via HTTPS-Protokoll über einen Reverse-Proxy. Dieser modifiziert die Zugriffe und leitet sie via HTTP-Protokoll an die internen Server weiter.
Und genau an dieser Stelle konnten wir die Ursache unseres Problems ausfindig machen.
Das von SVN verwendete WebDAV-Protokoll erfordert für die MOVE- und COPY-Operationen den Pfad- und Datei-Namen der Quell-Datei in der Request-URL und Pfad- und Datei-Namen der Ziel-Datei als URL im Request-Header. Bei der bei uns erforderlichen Umsetzung von HTTPS- auf HTTP-Protokoll beachten die HTTP-Proxies im Allgemeinen nur die Request-URL (Datei-Quelle) und nicht die im Request-Header vorhandenen URLs (Ziel-Datei).
Dies führt zu folgendem Fehlverhalten:
- Der Client sendet den Namen der Quell-Datei in der Request-URL in der Form
https://host.name/pfad/quelldateiname
und den Namen der Ziel-Datei im Request-Header als URL in der Form
https://host.name/pfad/zieldateiname
an den Proxy. - Der Proxy modifiziert die Request-URL zu
http://host.name/pfad/quelldateiname
und behält die URL im Request-Header in der Form
https://host.name/pfad/zieldateiname
und leitet den Request weiter an den internen Apache-SVN-Server. - Das WebDAV-Module des internen Apache-SVN-Servers prüft nun den Host-Namen und Port der Quell- und Ziel-Datei auf Übereinstimmung. Da HTTP (für Quell-Datei) und HTTPS (für Ziel-Datei) auf verschiedenen Ports laufen, schlägt die Überprüfung fehl, das WebDAV-Modul "meint", dass Quelle und Ziel auf verschiedenen Servern liegen und es kommt zu der Fehlermeldung
"502 bad gateway".
Da über den Proxy mehrere Services abgewickelt werden, war an dieser Stelle eine Konfigurations-Anpassung nicht erwünscht. Also sollte ein Header-Rewrite auf dem internen SVN-Server stattfinden.
Bei der Auswahl eines Verfahrens für einen Request-Header-Rewrite wählten wir das Apache-Modul mod_headers das ab Apache Version 2.2.4 für unsere Zwecke geeignet ist und nach Aktivierung mit einer einzelnen Zeile wie folgt
RequestHeader edit Destination ^https http early
in der Server-Konfiguration zur Lösung unseres Problems führte.
Die Zeile bewirkt die Ersetzung der Zeichenfolgen https zu http im Destination-Teil des Request-Headers, möglichst bevor andere Server-Module oder andere serverinternen Mechanismen zum Einsatz kommen.
Leider kann diese Einstellung nur auf (Virtual-)Server-Ebene stattfinden. Da auf betreffendem Server nur das SVN-System läuft, ist für uns diese Einschränkung nicht relevant.
Der Header-Rewrite hätte möglicherweise auch mit dem Apache-Module mod_rewrite realisiert werden können, aber nicht mit einer Zeile (und benötigte Regular Expressions sind zwar sehr universell, aber mal ganz ehrlich - in einigen Fällen haben sie mir in der Vergangenheit nicht so richtig Spass gemacht).
Zum Abschluss folgt zur Orientierung ein kleiner Ausschnitt aus unserer Server-Konfiguration als Beispiel:
<VirtualHost *:80>
ServerName localhost
RequestHeader edit Destination ^https http early
.
.
.
</VirtualHost>