Stephan: Apache - mod_rewrite

Hallo an Alle!

Ich hab da folgendes Problem, den Apache als Reverse-Proxy einzusetzen und gleichzeitig, unabhängig davon welche URL der Benutzer eingibt, immer auf eine bestimmte URL zu redirecten.

Die URL, so wie sie redirected werden soll hat folgendes Format:
http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false

Ich bräuchte da jetzt eine Regel mit Regular Expressions die mir sicherstellt, dass egal was vom Nutzer eingegeben wird, immer auf diese URL verlinkt wird.

Ich hab das auf das Unterverzeichnis /xxx bereits geschafft, allerdings möchte ich das ganze auch auf den kompletten Link schaffen.

Sprich: Gibt der Nutzer ein "http://mein.server/xxx/test.servlet?yyy=zz2&ENV_sss=false" anstatt "http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false" soll er trotzdem auf letztern Link verwiesen werden.

Ich weiß das war jetzt etwas umständlich beschrieben, aber vielleicht kann mir da trotzdem wer helfen. Danke schon mal.

Viele Grüße,
Stephan

  1. Hallo Stephan,

    Sprich: Gibt der Nutzer ein
    "http://mein.server/xxx/test.servlet?yyy=zz2&ENV_sss=false" anstatt
    "http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false" soll er
    trotzdem auf letztern Link verwiesen werden.

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false$
    RewriteRule . http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false [L,R=302]

    Grüße,
     CK

    --
    Wenn der Schüler bereit ist, erscheint der Meister.
    1. Hallo Christian!

      Danke schon mal für den Tipp, nur funktioniert das bei mir nocht nicht so ganz. Liegt allerdings eher bei mir... ;-)

      Also nochmal:
      Ich muss alle Anfragen an einen bestimmten (internen) Webserver (test1.nds.com) abfangen und über die Proxy Funktion an den eigentlichen Webserver (test.nds.com) weiterleiten. Es soll dabei immer nur die eine bestimmte URL (http://test.nds.com/xxx/framework.servlet?mandant=xxx&ENV_client=false) an den internen Webserver (test1.nds.com) weitergeleitet werden, egal was der Nutzer jetzt als URL an den Server übermittelt.

      Hier ein Auszug aus meiner httpd.conf:

      <VirtualHost test.nds.com:80>
       ProxyPassReverse / http://test1.nds.com:80/
       ServerName test.nds.com

      RewriteEngine ON
       RewriteLog logs/rewrite.log
       RewriteLogLevel 2

      [...]

      # Always replace with defined URL
         RewriteCond %{REQUEST_URI} !^http://test.nds.com/xxx/framework.servlet?mandant=xxx&ENV_client=false$
         RewriteRule . http://test.nds.com/xxx/framework.servlet?mandant=xxx&ENV_client=false [L,R=302]

      [...]

      # Now send everything through to proxy
       RewriteRule ^/(.+)$ http://test1.nds.com:80/$1 [P]
      </VirtualHost>

      Was mach ich da noch falsch? Danke.

      Gruß,
      Stephan

      Hallo Stephan,

      Sprich: Gibt der Nutzer ein
      "http://mein.server/xxx/test.servlet?yyy=zz2&ENV_sss=false" anstatt
      "http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false" soll er
      trotzdem auf letztern Link verwiesen werden.

      RewriteEngine On
      RewriteCond %{REQUEST_URI} !^http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false$
      RewriteRule . http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false [L,R=302]

      Grüße,
       CK

      1. Moin!

        RewriteRule . http://test.nds.com/xxx/framework.servlet?mandant=xxx&ENV_client=false [L,R=302]
         RewriteRule ^/(.+)$ http://test1.nds.com:80/$1 [P]

        Hast du schonmal darüber nachgedacht, diese beiden Regeln zu einer zu kombinieren. Ich meine: Statt eines temporären Redirects und dem Ende des Rewritings für den aktuellen Requeste könntest du dann doch gleich den Proxy anwerfen, oder? :)

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
        1. ...die sind deshalb nicht zusammengefasst, da ich auch noch andere Regeln zusätzlich am testen bin!

          Aber irgendwie war das ja auch nicht mein Problem...

          Gruß,
          Stephan

          Hast du schonmal darüber nachgedacht, diese beiden Regeln zu einer zu kombinieren. Ich meine: Statt eines temporären Redirects und dem Ende des Rewritings für den aktuellen Requeste könntest du dann doch gleich den Proxy anwerfen, oder? :)

          - Sven Rautenberg

          1. Moin!

            ...die sind deshalb nicht zusammengefasst, da ich auch noch andere Regeln zusätzlich am testen bin!

            Aber irgendwie war das ja auch nicht mein Problem...

            Dein Problem war, dass es nicht geht, was du da bislang am machen warst.

            Mein Lösungsvorschlag sollte diesen Zustand beheben. Aber offenbar hab ich dein Problem beim ersten Lesen falsch verstanden.

            Nach nochmaligem Lesen erkenne ich zumindest, dass ich dich eigentlich komplett überhaupt nicht mehr verstehe, bzw. dein Problem.

            Also würde es dir helfen, indem du mir hilfst und dein Problem noch mal etwas deutlicher machst.

            Dazu habe ich ein paar Fragen:

            1. Welche IP steckt hinter test1.nds.com? Welche IP steckt hinter test.nds.com? Soll heißen: Sitzen die beiden beteiligten Server auf einer Maschine, oder nicht?

            2. Wenn sie auf einer Maschine sind: Sind virtuelle Hosts für beide definiert?

            3. Welche URL gibt der Benutzer in seinen Browser ein?

            4. Welche URL soll final an welchen Server gesendet werden?

            5. Welche Auswirkungen soll das Rewriting auf die URL beim Benutzer haben? Redirects? Oder nur stille Umleitung intern?

            - Sven Rautenberg

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

              Also zu deinen Fragen:

              1. Welche IP steckt hinter test1.nds.com? Welche IP steckt hinter test.nds.com? Soll heißen: Sitzen die beiden beteiligten Server auf einer Maschine, oder nicht?

              Es handelt sich dabei um zwei verschiedene Maschinen (unterschiedliche IPs). Einer (test.nds.com) ist öffentlich zugänglich, test1.nds.com steht im internen Netz hinter FW.

              1. Wenn sie auf einer Maschine sind: Sind virtuelle Hosts für beide definiert?

              Trifft nicht zu!

              1. Welche URL gibt der Benutzer in seinen Browser ein?

              Eine x-beliebige URL. Soll heißen, egal was der Nutz versucht aufzurufen, er soll immer zu einer bestimtmen URL weitergeleitet werden...

              1. Welche URL soll final an welchen Server gesendet werden?

              Final soll an den (internen) Server test1.nds.com folgende URL geschickt werden:
              http://test1.nds.com/test/framework.servlet?mandant=test&ENV_client=false

              1. Welche Auswirkungen soll das Rewriting auf die URL beim Benutzer haben? Redirects? Oder nur stille Umleitung intern?

              Stille Umleitung intern...

              Vielleicht kannst du mir ja jetzt helfen. Würd mich freuen...

              Danke schon mal,
              Stephan

              1. Moin!

                1. Welche IP steckt hinter test1.nds.com? Welche IP steckt hinter test.nds.com? Soll heißen: Sitzen die beiden beteiligten Server auf einer Maschine, oder nicht?
                  Es handelt sich dabei um zwei verschiedene Maschinen (unterschiedliche IPs). Einer (test.nds.com) ist öffentlich zugänglich, test1.nds.com steht im internen Netz hinter FW.
                1. Welche URL gibt der Benutzer in seinen Browser ein?
                  Eine x-beliebige URL. Soll heißen, egal was der Nutz versucht aufzurufen, er soll immer zu einer bestimtmen URL weitergeleitet werden...

                Wirklich _jede_ X-beliebige URL (auch http://www.heise.de)? Oder nur irgendeine auf dem öffentlichen Server?

                1. Welche URL soll final an welchen Server gesendet werden?
                  Final soll an den (internen) Server test1.nds.com folgende URL geschickt werden:
                  http://test1.nds.com/test/framework.servlet?mandant=test&ENV_client=false

                Woher weiß der Browser des Benutzers, dass er den Request zum Proxy schicken soll?

                - Sven Rautenberg

                --
                "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
                1. ...habs mittlerweile selbst hingekriegt! Danke trotzdem für die nichtsaussagende Fragerunde... ;-)

                  • Stephan
                  1. Moin!

                    ...habs mittlerweile selbst hingekriegt! Danke trotzdem für die nichtsaussagende Fragerunde... ;-)

                    Ja und? Willst du uns jetzt dumm sterben lassen?

                    - Sven Rautenberg

                    --
                    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    2. ...weiß dafür jetzt eigentlich wer eine Lösung? Hat dieses bzw. ein ähnliches Problem schon mal wer gehabt? Egal was als URL eingegeben wird, soll immer eine bestimmt URL "geproxied" werden.

      Sollte wer eine Idee haben wäre ich sehr dankbar.

      Danke schon mal,
      Stephan

      Hallo Stephan,

      Sprich: Gibt der Nutzer ein
      "http://mein.server/xxx/test.servlet?yyy=zz2&ENV_sss=false" anstatt
      "http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false" soll er
      trotzdem auf letztern Link verwiesen werden.

      RewriteEngine On
      RewriteCond %{REQUEST_URI} !^http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false$
      RewriteRule . http://mein.server/xxx/test.servlet?yyy=zzz&ENV_sss=false [L,R=302]

      Grüße,
       CK