Apache2: Problem mit ReverseProxy (und redirects / PHP)
Michael
- webserver
Moin,
Also ich habe ein problem mit mod_proxy und redirects (header Location: ..)
Augangsstellung:
3 Domains, davon 2 interne und eine extern erreichbar.
Die internen will ich mit inem ReverseProxy nach aussen verfügbar machen.
Zu diesem zweck habe ich den virtualhost von domainext.xy so konfiguriert das die internen wie folgt erreichbar sind:
Das ganze funzt auch prima, bis auf die tatsache der er mir header redirects (Location: .. Nicht zu rande kommt.
Beispiel von domainint1.xy dort leitet die domainint1.xy/file.php nach domainint1.xy/file2.php weiter, blos wird das vom proxy nicht abgefangen und umgeschrieben, so lande ich am ende auf http://domainint1.xy/file2.php und nicht auf http://domainext.xy/domainint1.xy/file2.php jetz brauch ich ne möglichkeit das er auch redirect header umschreibt, nur wie stell ich das an?
Aktuelle Config:
Apache 2.0.54 mit allen nötigen mod_proxy modulen
<VirtualHost ...>
ServerName domainext.xy
ProxyRequests off
ProxyPass /domainint1.xy/ http://domainint1.xy/
ProxyHTMLURLMap http://domainint1.xy /domainint1.xy
<Location /domainint1.xy/>
ProxyPassReverse /
SetOutputFilter proxy-html
ProxyHTMLURLMap / /domainint1.xy/
ProxyHTMLURLMap /domainint1.xy /domainint1.xy
RequestHeader unset Accept-Encoding
</Location>
ProxyPass /domainint2.xy/ http://domainint2.xy/
ProxyHTMLURLMap http://domainint2.xy /domainint2.xy
<Location /domainint2.xy/>
ProxyPassReverse /
SetOutputFilter proxy-html
ProxyHTMLURLMap / /domainint2.xy/
ProxyHTMLURLMap /domainint2.xy /domainint2.xy
RequestHeader unset Accept-Encoding
</Location>
Options -Indexes MultiViews
DirectoryIndex index.php
DocumentRoot "/web/public/"
</VirtualHost>
Mit besten Grüssen
Michael
hi,
Das ganze funzt auch prima, bis auf die tatsache der er mir header redirects (Location: .. Nicht zu rande kommt.
Beispiel von domainint1.xy dort leitet die domainint1.xy/file.php nach domainint1.xy/file2.php weiter,
1. wie genau machst du das? angabe des ziels inkl. protokoll und komplettem URL ...?
2. das leitet natürlich nicht intern weiter, sondern schickt die anweisung an den client, ein anderes dokument anzufordern. wenn also generell der aufruf von http://domainext.xy/domainint1.xy klappt, gibt es für mich keinen ersichtlichen grund, warum ein nach redirect erfolgender zweiter request auf http://domainext.xy/domainint1.xy/andere-ressource nicht haargenauso funktionieren sollte.
gruß,
wahsaga
hi wahsaga,
- wie genau machst du das? angabe des ziels inkl. protokoll und komplettem URL ...?
HTTP/1.1 302 Found
Location: http://domainint1.xy/foo/
...
kann aber sein das das script nich nicht RFC konforme version sendet:
HTTP/1.1 302 Found
Location: /foo/
...
- das leitet natürlich nicht intern weiter, sondern schickt die anweisung an den client, ein anderes dokument anzufordern. wenn also generell der aufruf von http://domainext.xy/domainint1.xy klappt, gibt es für mich keinen ersichtlichen grund, warum ein nach redirect erfolgender zweiter request auf http://domainext.xy/domainint1.xy/andere-ressource nicht haargenauso funktionieren sollte.
Naja da der request vom client über den Proxy geht und dieser den weiter sendet und die antwort vom internen bekommt, sollte er diesen nicht 1:1 weiter schicken sondern den header umschreiben das er die externe proxy domain hinzufügt / ersetzt.
Da ich eine lösung dafür relativ dringlich brauche bin ich sogar bereit EUR 50,-- für eine funktionierende lösung zu zahlen :)
lg
Michael
Moin!
HTTP/1.1 302 Found
Location: http://domainint1.xy/foo/
...kann aber sein das das script nich nicht RFC konforme version sendet:
HTTP/1.1 302 Found
Location: /foo/
Das könnte bei vielen Browsern sogar in Deinem Sinne funktionieren, _obwohl_ es falsch ist.
Lösung:
Du möchtest anhand der IP feststellen, ob der Request von innen oder von außen kommt und bereits Deine PHP-Skripte(?) entsprechend so anpassen, dass die dann statt:
Location: http://domainint1.xy/foo/
ein
Location: http://domainext.xy/domainint1.xy/foo/
senden.
Da der Apache ein primär ein Webserver ist kannst Du nicht den gleichen Umfang in der Funktionalität wie beim Squid verlangen.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin fastix®!
HTTP/1.1 302 Found
Location: /foo/
Das könnte bei vielen Browsern sogar in Deinem Sinne funktionieren, _obwohl_ es falsch ist.Lösung:
Du möchtest anhand der IP feststellen, ob der Request von innen oder von außen kommt und bereits Deine PHP-Skripte(?) entsprechend so anpassen, dass die dann statt:Location: http://domainint1.xy/foo/
ein
Location: http://domainext.xy/domainint1.xy/foo/
senden.
leider nicht die lösung, denn ich hab nicht immer die möglichkeit die scripte an zu passen, weil sonst hätte ich das mit dem razusfinden woher der request kommt, schon lange gemacht :)
Weil auf den internen servern weis gott was laufen kann.
Da der Apache ein primär ein Webserver ist kannst Du nicht den gleichen Umfang in der Funktionalität wie beim Squid verlangen.
ok über squid hab ich noch nicht nachgedacht, aber das is ja für *nix, und meine lösung muss auf win32 arbeiten. es muss auch nicht umbedingt Apache sein, nur irgent ein reverseproxy der SSL kann.
PS: meine config habe ich von:
http://www.apacheweek.com/features/reverseproxies adaptiert.
dort steht was zum thema redirect's aber nichts verwertbares.
lg
michael
Moin!
ok über squid hab ich noch nicht nachgedacht, aber das is ja für *nix, und meine lösung muss auf win32 arbeiten.
Projekt:
http://www.acmeconsulting.it/pagine/opensource/squid/squidnt25.htm
Download:
http://www.acmeconsulting.it/pagine/opensource/download/squid.htm
Dokumentation:
http://squid-docs.sourceforge.net/
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
ok über squid hab ich noch nicht nachgedacht, aber das is ja für *nix, und meine lösung muss auf win32 arbeiten.
Projekt:
http://www.acmeconsulting.it/pagine/opensource/squid/squidnt25.htm
Download:
http://www.acmeconsulting.it/pagine/opensource/download/squid.htm
Dokumentation:
http://squid-docs.sourceforge.net/
hmm, ok hab mir das mal grob angesehen, is ja extrem umfangreich. so wie ich das gesehen hab kann der noch nicht wirklich sicher mit SSL bzw. hab ich nichts gefunden wie ich das mit den verzeichnissen machen kann.
hm, das ding is mir zu hoch.. (
lg
michael
Moin!
hmm, ok hab mir das mal grob angesehen, is ja extrem umfangreich. so wie ich das gesehen hab kann der noch nicht wirklich sicher mit SSL bzw. hab ich nichts gefunden wie ich das mit den verzeichnissen machen kann.
Kein Proxy kann wirklich SSL...
Die leiten das ungeprüft (Es muss nicht mal http sein, auch telnet oder ssh lässt sich auf eine solche Verbindung draufpacken) durch und können genau genommen nicht mal was chachen, weil dazu entschlüsselt werden müsste. Gänge dies, dann wäre nichts einfacher als ein man-in-the-middle-Angriff auf diese Verbindungen.
Folge: Du kannst also auch auf dem Proxy nicht über jede ausgelieferte Seite "drübergehen" und die Links oder Location-Header verändern. Das ist jedoch, was Du willst. Dir bleibt also bei Deiner Lösung lediglich: Entweder die Skripte auf dem Server anzupassen, so das diese die richtigen Links und Header ausliefern oder das gesamte Konzept neu zu überdenken.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
Kein Proxy kann wirklich SSL...
Die leiten das ungeprüft (Es muss nicht mal http sein, auch telnet oder ssh lässt sich auf eine solche Verbindung draufpacken) durch und können genau genommen nicht mal was chachen, weil dazu entschlüsselt werden müsste. Gänge dies, dann wäre nichts einfacher als ein man-in-the-middle-Angriff auf diese Verbindungen.
Ist mir klar, doch hier geht es darum normale port80 seiten aus dem internen netz nach ausen über https verfügbar zu machen, eben http://sslproxy.xy/nicht-ssl-seite.xy/
weil ich nur für sslproxy.xy ein gültiges certifikat habe und nicht für die anderen domains.
lg
michael