Apache, mod_proxy und Reverse Proxy

I.MC

Watt soll denn hier hin?
Hi,

Ich würde gernen einen 2. Apache über den Namensraum des ersten aufrufen. Das klappt auf sehr einfach mittels


ProxyPass /test http://Ziel
ProxyPassReverse /test http://Ziel

Nur, wenn unter Ziel nun ein absoluter Link aufgerufen wird ala <a href="/src/options.php">Options</a>, dann verlässt der Server den Bereich des 2. Servers und kehrt einfach auf /src zurück. Da findet er dann natürlich nix. Eigentlich dachte ich, dass man dann unter /test/src landet, aber dem ist wohl nicht so. Was soll man dann mit der Funktion :-(

Gruß, I.MC
 
I.MC schrieb:
Hi,

Ich würde gernen einen 2. Apache über den Namensraum des ersten aufrufen. Das klappt auf sehr einfach mittels


ProxyPass /test http://Ziel
ProxyPassReverse /test http://Ziel

Nur, wenn unter Ziel nun ein absoluter Link aufgerufen wird ala <a href="/src/options.php">Options</a>, dann verlässt der Server den Bereich des 2. Servers und kehrt einfach auf /src zurück. Da findet er dann natürlich nix. Eigentlich dachte ich, dass man dann unter /test/src landet, aber dem ist wohl nicht so. Was soll man dann mit der Funktion :-(

Gruß, I.MC

Moin,

ich hatte vor kurzem so einen ähnlichen Fall. Dort sollten Seiten eines 2. Servers über eine feste IP-Adresse abgerufen werden und die Seiten des 2. Servers sollten über eine feste URL integriert werden. Keiner der Nutzer hatte eine feste IP-Adresse, aber alle nutzen einen unserer Server als zentrale 'Anlaufstelle'.
Für den Apache 2 habe ich das Modul mod_proxy_html benutzt, das sich als Filter in die Ausgabe des Indianers einklinkt. Über Konfigurationsanweisungen kannst du das Umschreiben von Links im HTML-Code vor dem Ausliefern an den Client steuern. Ein gutes Tutorial findest du hier ->http://www.apacheweek.com/features/reverseproxies. Das Modul findet sich auch in den Ports.

Vielleicht hilft dir das.

Gruß c.
 
Das ist genau, was ich suche. In meinem Fall sollte ja eigentlich ein Eintrag ala

ProxyPass /test http://10.0.0.6
ProxyPassReverse /test http://10.0.0.6
ProxyHTMLURLMap / /test

reichen. Das funktioniert aber nur korrekt, ich die Adresse mit einem Slash am Ende aufrufe. Das tut aber normalerweise kein Mensch und lasse ich den slash am Ende weg, dann hat die Anweisung:

ProxyHTMLURLMap / /test

keinen Effekt. Idee?

Gruß, I.MC
 
I.MC schrieb:
Das funktioniert aber nur korrekt, ich die Adresse mit einem Slash am Ende aufrufe.
Mir reichte das mit dem Slash am Ende, da die Leutchen auf einen Link klicken müssen, um auf die externe Seite zu kommen.

I.MC schrieb:
Idee?

Gruß, I.MC
Ja. In dem Fall müssen wir das, von mir sehr geschätzte mod_rewrite bemühen.
Das ist ohne Ironie gemeint.

Ich habe das mal mit folgendem Hack gemacht:

Code:
        RewriteEngine   On
        RewriteCond     %{REQUEST_URI}  !^/test/$
        RewriteRule     ^/test$   http://domain.tld/test/

Bei mir funktioniert es so.

Gruß c.
 
Das funktioniert hier nicht. Aber ich hätte auch mal selber an die Rewrite Engine denken können, die rennt hier nämlich auch eh schon :-). Ich guck mal...

I.MC
 
Wie soll dein Beispiel funktionieren? Du sagt als Kondition, dass ALLES, was ungleich /test/ umgeleitet werden soll. Das ist wohl nicht der gewünschte Effekt, da dann auch alle anderen Adressen nicht mehr erreichbar sind. Z.B. würde ein /test/ bei dir ebenfalls umgebogen...

Ich habe noch mal ein wenig gefummelt, aber es will um's Verrecken nicht klappen und ich verstehe jetzt echt nicht wieso :-(. Ich habe es momentan wie folgt.

Code:
RewriteEngine On
RewriteCond %{HTTPS} ^off
RewriteCond %{REMOTE_ADDR} !^10\.
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R]
RewriteCond %{REQUEST_URI} ^/test$
RewriteRule ^.*$ https://%{SERVER_NAME}/test/ [R]

ProxyRequests Off
SetOutputFilter proxy-html
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /test http://10.0.0.6
ProxyPassReverse /test http://10.0.0.6
ProxyHTMLURLMap / /test

Und jetzt wird es noch komischer. Wenn ich die RewriteCond Nr. zwei umändere auf /ng also RewriteCond %{REQUEST_URI} ^/ng$ dann WIRD da umgeleitet!?!? Aber auch nur, wenn man per http darauf zugreift, geht man per https heran funktioniert es wiederum nicht. Ich muss noch mal weiter buddeln...

I.MC
 
I.MC schrieb:
Wie soll dein Beispiel funktionieren? Du sagt als Kondition, dass ALLES, was ungleich /test/ umgeleitet werden soll. Das ist wohl nicht der gewünschte Effekt, da dann auch alle anderen Adressen nicht mehr erreichbar sind. Z.B. würde ein /test/ bei dir ebenfalls umgebogen...
Da verstehst du etwas falsch. Der Ausdruck bedeutet, das nur auf URIs, die nicht auf /test/ lauten die Rule überhaupt erst angewendet wird. Bei allen anderen wird hier die RewriteEngine schon aufhören weiter zu machen.
Die Rule bedeutet schließlich, das wenn der RegEx auf die URI passt auch umgeleitet wird.

Ich habe nochmal auf meinem Testsystem getestet und bleibe dabei: Es funktioniert.
Basta!

Du hast in einem vorherigen Post geschrieben, das du schon die RewriteEngine benutzt.
Kann es sein, das sich die Regeln vielleicht ins Gehege kommen? Eventuell musst du bei den von mir genannten Ausdrücken die Flags anpassen.


Gruß c.
 
Nun die Cond kannst du dann aber doch auch weglassen, da wie wir uns ja einig sind, dass diese wahr wird für alle URIs ungleich /test/. Damit überlässt du es ausschließlich der folgenden RewriteRule korrekt zu ändern, was ja auch funktioniert. Es macht das gleiche wie meine Idee. Aber deine wie meine Lösung funktionieren hier nicht, sobald ich als neues Ziel http://EIGENE-DOMAIN/test/ angebe. Sobald ich eine bliebige andere domain angebe, funktionieren unsere beiden Varianten wie gewünscht, ausser ich gehe per https dran, dann geht auch das nicht (auch wenn ich alle anderen Regeln abschalte). Komisch, irgendwie wird zwischen http und https unterschieden...

I.MC
 
Ok, da kann man sinieren, ob es günstiger ist, die Rule auf alle Requests anzuwenden, oder nur auf die, die es 'nötig' haben.

Da bin ich jetzt auch überfragt, warum es bei dir nicht klappt.
Da bleibt mir nur noch ein Tipp:
RewriteLog und RewriteLogLevel zu nutzen.

Gruß c.
 
So, es geht. Wieso es jetzt auch mit der korrekt eingetragenen Domain funktioniert (wie bei dir) ist mir ein Rätsel, da ich nichts geändert habe. Warum es aber mit demm SSL nicht ging ist inzwischen klar. Mir dämmerte plötzlich, dass die Rewrite Regeln auch in jedem VirtualHost erneut definiert werden müssen und da https in einem VH drin ist... erklärt sich das dann von selber :-).

Gruß, I.MC
 
Nun bin ich auf das nächste Problem gestoßen. Die beiden Apaches müssen untereinander die Verbindung verschlüssel, weil sonst das gpg plugin nicht geht. Soweit so gut, einfach sslproxy aktiviert. Das klappt auch meist, oft aber auch nicht. Drückt man dann auf Seite neuladen, flupp, geht es wieder. Die Fehlermeldung die ich dann sehe im ersten Apache, also dem, der Proxy spielt ist:

proxy: error reading status line from remote server 10.0.0.6, referer: https://domain/test/src/login.php
proxy: Error reading from remote server returned by /test/src/redirect.php, referer: https://domain/test/src/login.php

und im Browser sehe ich ähnliches:

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request POST /test/src/redirect.php.

Reason: Error reading from remote server

Da werde ich jetzt nicht schlau raus. Ohne internes SSL geht alles super.

Gruß, I.MC
 
Zurück
Oben