Michael: Apache2: Problem mit ReverseProxy (und redirects / PHP)

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:

  • Domainext.xy/domainint1.xy
  • Domainext.xy/domainint2.xy

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi wahsaga,

      1. 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/
      ...

      1. 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

      1. 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®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. 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

          1. 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®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
            1. 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

              1. 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®

                --
                Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                1. 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