Stephan: mod_rewrite, URL Anzeige im Browser

Hallo!

Bin dabei Apache als Reverse Proxy aufzusetzen und hab da ein (kleines) Problem mit dem URL-Rewriting.
Ich spreche dabei einen Server vor der Firewall an (www.extern.com) und will von dem aus auf den internen Server (www.intern.com) hinter der Firewall den Content holen:
Allerdings möchte ich dabei nicht die überschriebene URL im Browserfenster anzeigen lass (sprich: https://www.intern.com/test/...) sondern die ursprüngliche URL eingabe (sprich: http://www.extern.com/test.html).

Habs momentan mit foglenden Regeln versucht:
[...]
 RewriteCond %{REQUEST_URI} !^http://www.extern.com/*$
 RewriteRule . https://www.intern.com/test/... [P]
[...]

Hat diesbezüglich wer eine Idee? Für Tipps wäre ich sehr dankbar.

Gruß,
Stephan

  1. Hi,

    Allerdings möchte ich dabei nicht die überschriebene URL im Browserfenster anzeigen lass

    undenkbar.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Moin!

      Allerdings möchte ich dabei nicht die überschriebene URL im Browserfenster anzeigen lass

      undenkbar.

      Doch, ausschließlich so denkbar. Denn die Firewall wird es zu verhindern wissen, dass von irgendwoher Zugriffe auf den internen Server stattfinden.

      Deshalb muß die URL von extern.com in der Zeile drinbleiben, und dieser Server als Proxy auftreten. Alles andere wäre unmöglich.

      Ich frage mich (zurück zum Problem) nur gerade, was das Problem ist.

      Warum die RewriteCond? Warum nicht einen vernünftigen regulären Ausdruck in der RewriteRule formulieren, der alle "passenden" URL dann per Proxy [P] weiterleitet an intern?

      - Sven Rautenberg

      --
      "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
      1. Moin zurück,

        Warum die RewriteCond? Warum nicht einen vernünftigen regulären Ausdruck in der RewriteRule formulieren, der alle "passenden" URL dann per Proxy [P] weiterleitet an intern?

        Das hab ich auch bereits probiert, allerdings wird mit der Option [P] nicht an den internen Server weitergeleitet sondern er sucht die Seite auf dem externen Server. Verwende ich die Option [R] anstelle von [P] dann funktioniert der Redirect auch.

        Kannst du mir bitte sagen wie die RewriteRule formuliert werden müsste, damit das auch mit der Option [P] klappt?

        Danke,
        Stephan

        1. Moin!

          Warum die RewriteCond? Warum nicht einen vernünftigen regulären Ausdruck in der RewriteRule formulieren, der alle "passenden" URL dann per Proxy [P] weiterleitet an intern?

          Das hab ich auch bereits probiert, allerdings wird mit der Option [P] nicht an den internen Server weitergeleitet sondern er sucht die Seite auf dem externen Server. Verwende ich die Option [R] anstelle von [P] dann funktioniert der Redirect auch.

          Redirect willst du nicht.

          Wenn der Redirect aber funktioniert, dann kann jeder von außen auf den internen Server zugreifen. Ist das schlau?

          Andererseits: Kann man vom externen Server aus auch zugreifen? Muß man, ansonsten klappt das Proxying natürlich nicht.

          Kannst du mir bitte sagen wie die RewriteRule formuliert werden müsste, damit das auch mit der Option [P] klappt?

          Nun, wenn ich mir die Doku so ansehe, dann gilt grundsätzlich:
          RewriteRule Pattern_der_externen_URL http://Ziel_URL_auf_anderem_Server [P]

          Wenn das Schwierigkeiten macht: Den Grund klären. :)
          Wenn [R] statt [P] die korrekte URL im Browser anzeigt, und diese Seite dann auch lädt, ist vielleicht der Apache falsch konfiguriert. Logfiles checken hilft dann.

          - Sven Rautenberg

          --
          "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
          1. Moin zurück,

            Nun, wenn ich mir die Doku so ansehe, dann gilt grundsätzlich:
            RewriteRule Pattern_der_externen_URL http://Ziel_URL_auf_anderem_Server [P]

            Ja damit hab ichs bereits versucht, aber da wird dann der Pfad am externen Server gesucht und ich bekomm als Fehlermeldung "You don't have permission to access ... on www.extern.com."

            Obwohl die RewriteRule wie von dir oben auch beschrieben auf http://www.intern.com verweist. Als Option wurde [P] gewählt...

            Mit der Option [P] soll ja nur auf den internen Server geproxied werden, die URL im Browser bleibt aber bei der ursprünglich eingegebenen: http://www.extern.com/... Oder?

            Gruß,
            Stephan

            1. Moin!

              Ja damit hab ichs bereits versucht, aber da wird dann der Pfad am externen Server gesucht und ich bekomm als Fehlermeldung "You don't have permission to access ... on www.extern.com."

              Sicher? Wie lautet die Meldung _genau_? Und was sagt das Logfile dazu? Und was sagt das spezielle Rewriteing-Logfile dazu, welches du anlegen und mit Information füllen kannst?

              Soll heißen: Könnte es einerseits sein, dass der externe Server intern seinen Berechtigungscheck laufen läßt, noch bevor der Proxy aktiv werden kann? Könnte es andererseits sein, dass gar keine Proxyfunktionalität existiert bzw. erst noch konfiguriert werden muß?

              Obwohl die RewriteRule wie von dir oben auch beschrieben auf http://www.intern.com verweist. Als Option wurde [P] gewählt...

              Und mit [R] funktioniert es?

              Mit der Option [P] soll ja nur auf den internen Server geproxied werden, die URL im Browser bleibt aber bei der ursprünglich eingegebenen: http://www.extern.com/... Oder?

              So ist die Theorie.

              - Sven Rautenberg

              --
              "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
              1. Moin zurück!

                Sicher? Wie lautet die Meldung _genau_? Und was sagt das Logfile dazu? Und was sagt das spezielle Rewriteing-Logfile dazu, welches du anlegen und mit Information füllen kannst?

                Hier die genaue Fehlermeldung im Browser am Client:
                Forbidden
                You don't have permission to access /test_int.html on this server.
                (Apache/2.0.48 Server at www.extern.com Port 80)

                Im Error Logfile am Apache steht:
                [Tue Feb 24 10:15:12 2004] [warn] proxy: No protocol handler was valid for the URL /optik_int.html. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

                Als Proxy-Submodules hab ich Folgende geladen:
                LoadModule proxy_module modules/mod_proxy.so
                LoadModule proxy_connect_module modules/mod_proxy_connect.so
                LoadModule proxy_http_module modules/mod_proxy_http.so

                Fehlt da vielleicht noch was?

                Und im Rewrite-Logfile steht:
                [...][www.extern.com/sid#499238][rid#47d598/initial] (2) init rewrite engine with requested uri /test_int.html
                [...][www.extern.com/sid#499238][rid#47d598/initial] (3) applying pattern '^/test_int.html$' to uri '/test_int.html'
                [...][www.extern.com/sid#499238][rid#47d598/initial] (2) rewrite /test_int.html -> https://www.intern.com/test/test.servlet?tester=TestInternational
                [...][www.extern.com/sid#499238][rid#47d598/initial] (3) split uri=https://www.intern.com/test/test.servlet?tester=TestInternational -> uri=https://www.intern.com/test/test.servlet, args=tester=TestInternational
                [...][www.extern.com/sid#499238][rid#47d598/initial] (2) forcing proxy-throughput with https://www.intern.com/test/test.servlet
                [...][www.extern.com/sid#499238][rid#47d598/initial] (1) go-ahead with proxy request proxy:https://www.intern.com/test/test.servlet [OK]

                » Und mit [R] funktioniert es?
                Ja, mit der Option [R] funktionierts wie bereits im vorigen Posting erwähnt. Allerdings überschreibt ja der Browser dann die eingegebene URL zum externen Server mit der angegebenen zum internen Server.
                Sprich: Aus der Eingabe im Browser http://www.extern.com/test_int.html wird in der Adresszeile https://www.intern.com/test/test.servlet?tester=TestInternational
                Ich hätte aber wie gesagt gerne die externe Adresse im Adressfeld!

                Gruß,
                Stephan

                1. ...hab gerade gesehen, dass ich einmal "/optik_int.html" und dann wieder "/test_int.html" in meinem Posting verwendet habe. Lass dich dadurch bitte nicht verwirren, es heißt immer "/test_int.html"!!!

                  Gruß,
                  Stephan

                2. Moin!

                  Hier die genaue Fehlermeldung im Browser am Client:
                  Forbidden
                  You don't have permission to access /test_int.html on this server.
                  (Apache/2.0.48 Server at www.extern.com Port 80)

                  Im Error Logfile am Apache steht:
                  [Tue Feb 24 10:15:12 2004] [warn] proxy: No protocol handler was valid for the URL /optik_int.html. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

                  Ich denke, damit ist die Erklärung für das Versagen gefunden. mod_rewrite braucht offensichtlich das Proxy-Modul, um funktionieren zu können, hat es aber nicht.

                  Als Proxy-Submodules hab ich Folgende geladen:
                  LoadModule proxy_module modules/mod_proxy.so
                  LoadModule proxy_connect_module modules/mod_proxy_connect.so
                  LoadModule proxy_http_module modules/mod_proxy_http.so

                  Sicher, dass die geladen sind? Im Config-File steht soviel Krams drin, die eine Hälfte ist dabei für DSO-Module, die andere Hälfte für was-weiß-ich-muß-ich-nachgucken.

                  Fehlt da vielleicht noch was?

                  » Und mit [R] funktioniert es?
                  Ja, mit der Option [R] funktionierts wie bereits im vorigen Posting erwähnt. Allerdings überschreibt ja der Browser dann die eingegebene URL zum externen Server mit der angegebenen zum internen Server.

                  Das ist ok. Der Browser macht dann ja einen neuen Request, und der Server antwortet - daran liegts also nicht, sondern tatsächlich an der mangelnden Proxy-Fähigkeit deines Apache.

                  Die Doku zu mod_rewrite fordert explizit:
                  "Notice: To use this functionality make sure you have the proxy module compiled into your Apache server program. If you don't know please check whether mod_proxy.c is part of the httpd -l'' output. If yes, this functionality is available to mod\_rewrite. If not, then you first have to rebuild the httpd'' program with mod_proxy enabled."

                  Nun ja: "Compiled into" klingt hart, aber jedenfalls nicht nach DSO, auch wenn ich annehme, dass es auch damit funktionieren könnte. Aber wenn nicht: "compile into your apache", und die Sache könnte erledigt sein.

                  Jedenfalls ist der grundsätzliche Ansatzpunkt eben dein Proxymodul, was funktionieren muß, nicht deine RewriteRule.

                  Ach ja: Zusätzliche Schwierigkeit _könnte_ (muß aber nicht) die Verwendung von SSL sein. Zu Testzwecken mal eine http-URL anzufordern (muß ja nicht vom internen Server sein, kann ja auch www.google.de sein) wäre vielleicht nicht verkehrt.

                  - Sven Rautenberg

                  --
                  "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
                  1. Moin zurück!

                    Die Doku zu mod_rewrite fordert explizit:
                    "Notice: To use this functionality make sure you have the proxy module compiled into your Apache server program. If you don't know please check whether mod_proxy.c is part of the httpd -l'' output. If yes, this functionality is available to mod\_rewrite. If not, then you first have to rebuild the httpd'' program with mod_proxy enabled."

                    Das hab ich mir jetzt auch angesehen, compiled-in ist die mod_proxy nicht. Mein Problem ist nur dass ich den Apache unter Windows laufen lass, und jetzt momentan nicht weiß, wie ich da dieses Modul "rein kompilieren" kann. Ich lade die Module nur über DSO im httpd.conf, aber das scheint ja wohl nicht genug zu sein...

                    Hast du eine Ahnung wie ich die unter Windows kompilieren kann?

                    Thanks,
                    Stephan

                    1. Moin!

                      Das hab ich mir jetzt auch angesehen, compiled-in ist die mod_proxy nicht. Mein Problem ist nur dass ich den Apache unter Windows laufen lass, und jetzt momentan nicht weiß, wie ich da dieses Modul "rein kompilieren" kann. Ich lade die Module nur über DSO im httpd.conf, aber das scheint ja wohl nicht genug zu sein...

                      Hast du eine Ahnung wie ich die unter Windows kompilieren kann?

                      Nein. Ich weiß nur soviel: Ohne Compiler wird das schwierig.

                      Allerdings: Warum zum #!&/(&"@! ist der externe Server ein Windows-Rechner. Ist ja ganz finster, uiuiui.

                      - Sven Rautenberg

                      --
                      "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
                      1. Moin zurück!

                        Allerdings: Warum zum #!&/(&"@! ist der externe Server ein Windows-Rechner. Ist ja ganz finster, uiuiui.

                        Da hast du wohl recht... ;-)

                        Hab mir den Apache jetzt auf Linux aufgesetzt und die notwendigen Module hinein kompiliert. Jetzt funzts auch, nur ein Problem gibts noch:
                        Hab da was vom Modul mod_proxy_html (3rd party) gelesen, damit auch die Links in der Webseite richtig angezeigt werden können.
                        Hast du da nähere Infos dazu, hab zwar die mod_proxy_html.c gefunden aber weiß jetzt nicht so recht wie ich die kompilieren und dann nutzen kann?

                        Thanks for help,
                        STephan

                        1. Moin!

                          Hab da was vom Modul mod_proxy_html (3rd party) gelesen, damit auch die Links in der Webseite richtig angezeigt werden können.
                          Hast du da nähere Infos dazu, hab zwar die mod_proxy_html.c gefunden aber weiß jetzt nicht so recht wie ich die kompilieren und dann nutzen kann?

                          Nein, ich hab keine näheren Infos. Du kannst das Problem einerseits mit relativen Links umgehen, und andererseits mit einer künstlich passend gehaltenen Linkstruktur, indem die überlappenden Bereiche von intern und extern eben "zufällig" identisch passend verlinkt sind.

                          - Sven Rautenberg

                          --
                          "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
                          1. ...danke noch mal für deine Hilfe! Werde versuchen das Problem mit relativen Links zu umgehen.

                            Gruß,
                            Stephan