Merenda: RewriteRule - Weiterleitung für ein Wartungsfenster

Hallo,

ich plane eine Wartung für unseren Webserver. Ich hab etwas recherchiert und bin auf die RewriteEngine gestoßen.
Der Plan ist, dass ich während der Wartung auf die Seite zugreifen kann und alle anderen auf eine Wartungsseite umgeleitet werden.
Im Internet habe ich einige Anleitungen gefunden, die ich auch getestet habe, aber leider hat keine der möglichkeiten gepasst.
Vielleicht kann mir jemand weiter helfen? Meine Vhost-Konfiguration sieht wie folgt aus (auf dem Webserver läuft nur ein Vhost):

[code=html]
<VirtualHost 123.456.789.101:80>
        ServerName  subdomain.firma.de
        UseCanonicalName  Off

RewriteEngine on

RewriteCond %{REMOTE_ADDR} !^123.456.789.123$
        RewriteRule ^(.*)$ \http://www.subdomain.firma.de/maint/index.html [R=302,L]

Alias /maint /var/www/maintenance
        <Directory /var/www/maintenance>
                Options FollowSymLinks
                AllowOverride All
        </Directory>

JkMount /* ajp13
        JkUnMount /maint* ajp13
        DocumentRoot /www/hauptanwendung/
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
</VirtualHost>
[/code]

Mit der oben vorgestellten Konfiguration, bekomme ich eine Fehlermeldung: "Die weiterleitung würde nie beendet werden".
Was ich komisch finde, wenn ich aber eine andere Afresse in der RewriteRule eintrage, wie z.B.: www.heise.de, dann fuktioniert die Weiterleitung? Was läuft da falsch?

  1. RewriteCond %{REMOTE_ADDR} !^123.456.789.123$
            RewriteRule ^(.*)$ \http://www.subdomain.firma.de/maint/index.html [R=302,L]

    Mit der oben vorgestellten Konfiguration, bekomme ich eine Fehlermeldung: "Die weiterleitung würde nie beendet werden".

    "To understand recursion, you must first understand recursion."

    Du produzierst eine Endlosschleife - ist das bei der Fehlermeldung nicht offensichtlich.

    Wenn die IP-Adresse des Clients nicht der gegeben entspricht wird auf /maint/index.html umgeleitet. Bei diesem Request wird geprüft, ob die Adresse des Clients nicht der gegebenen entspricht und in diesem Fall auf /maint/index.html umgeleitet. Dort wird geprüft ...

    Was ich komisch finde, wenn ich aber eine andere Afresse in der RewriteRule eintrage, wie z.B.: www.heise.de, dann fuktioniert die Weiterleitung?

    Wenn die IP-Adresse des Clients nicht der gegeben entspricht wird auf die heise-Seite umgeleitet. Dort wird nichts dergleichen geprüft.

    1. Hi,

      danke erst mal für deine Antwort.
      Aber wie löse ich das Problem? Mir ist nicht klar wie ich diese Endlosschleife erzeuge?

      1. Aber wie löse ich das Problem? Mir ist nicht klar wie ich diese Endlosschleife erzeuge?

        Ich versuchs mal so:

        Lies meinen Beitrag nochmal aufmerksam durch. Wenn du es nicht verstanden hast lies den Beitrag nochmal durch: so lange bis die Abbruchbedingung der Schleife erreicht ist.

        Mit anderen Worten, du brauchst eine zweite Bedingung, die die Schleife an einem bestimmten Kriterium beendet, eine Bedingung die nicht immer zutrifft, aber im speziellen Fall, wenn die Zielseite erreicht ist.

        1. Ich verstehe nicht warum du mir keine normale Antwort geben kannst. Naja, danke trotzdem ich versuch es einfach mal alleine.

          1. Ich verstehe nicht warum du mir keine normale Antwort geben kannst.

            Ich habe dir sehr detailliert erklärt wie das Problem zustande kommt und ich habe zusätzlich mit einem etwa 3 Meter hohen Zaunpfahl gewunken. ChrisB hat dir übrigens dasselbe (offensichtliche) gesagt.

            Ich sehe nicht ein, warum ich dir ein so derart tiviales Problem vorkauen und lösen soll.

            Naja, danke trotzdem ich versuch es einfach mal alleine.

            Das ist der Zweck dieses Forums: dir Tipps zu geben, wie du alleine dein Problem lösen kannst bzw. dir bei der Fehlersuche zu helfen. Vorgebissene Lösungen bekommst du hier aber nicht - außer irgendwer knallt dir aus Profilierungssucht einen Brocken hin der dir zwar jetzt hilft aber beim nächsten Auftauchen eines ähnlich gearteten Problems wieder nicht hilft.

            Wenn du es nicht schaffst dieses Problem aufgrund der Beschreibung zu lösen, kannst du gerne weitere Fragen stellen.

            Wenn du nicht weißt, was mit einer "Abbruchbedingung" gemeint ist, kannst du nachfragen - ich bin gerne bereit dir entsprechende Antworten zu geben.

            Wenn du ein derart einfaches Problem nicht selbst verstehst[1] oder lösen kannst[2], bist du ggf. für diese Tätigkeit nicht geeignet und solltest womöglich jemandem Geld geben, dass er/sie es für dich erledigt.

            Die Alternativen sind stundenlanges Herumsuchen und Zeit verschwenden sowie etwa 5 Minuten scharf nachdenken und eine Rückfrage stellen.

            [1] es logisch zu erfassen, was zu tun ist dass es nicht passiert.
            [2] es gemäß der Dokumentation synatktisch zu erfassen.

            1. Hallo,

              danke noch Mals für deine ausführliche Erklärung.
              Ich werde mir diene Antwort nochmals genauer durchlesen, bei weiteren Fragen werde ich mich noch mal melden.

              Grüße
              Claudia

              1. Hi,

                also die Weiterleitung habe ich mit folgender RewriteRule hin bekommen:[code=html]   RewriteCond %{REMOTE_ADDR} !=11.12.13.14
                RewriteCond %{REQUEST_URI} !=/maint/index.html [NC]
                RewriteRule ^(.*)$ http://www.subdomain.firma.de/maint/index.html [R=302,NC,L][/code]

                Jetzt habe ich nur ein Problem, die Wartungsseite nutzt Bilder und CSS. Wenn ich dir Rewrite-Engine ausschalte, wird dass alles richtig aufgelöst, sobald ich Sie einschalte, werde ich auf die Wartungsseite weitergeleitet, aber die Formatierung ist weg, dass heißt, es werden keine Bilder mehr angezeigt und die Tabellen u.s.w. sind weg. An was kann das liegen?

                1. RewriteCond %{REMOTE_ADDR} !=11.12.13.14
                  RewriteCond %{REQUEST_URI} !=/maint/index.html [NC]
                  RewriteRule ^(.*)$ http://www.subdomain.firma.de/maint/index.html [R=302,NC,L][/code]

                  Da stimmt etwas nicht - was hat es mit dem =-Zeichen auf sich? Zudem hat der Punkt einem regulären Ausdruck eine Sonderbedeutung, den musst du maskieren, ansonsten werden auch noch vieel andere deine Wartungssseite zu Gesicht bekommen.

                  Dass du für Beispiele example.com usw. verwenden sollst, hat dir ChrisB bereits gesagt.

                  Jetzt habe ich nur ein Problem, die Wartungsseite nutzt Bilder und CSS. Wenn ich dir Rewrite-Engine ausschalte, wird dass alles richtig aufgelöst, sobald ich Sie einschalte, werde ich auf die Wartungsseite weitergeleitet, aber die Formatierung ist weg, dass heißt, es werden keine Bilder mehr angezeigt und die Tabellen u.s.w. sind weg. An was kann das liegen?

                  Was auch klar ist, du leitest schließlich sämtlichen Traffic auf /maint/index.html um - auch das lässt sich (womöglich sogar in einen einzigen usdruck) fassen den du entsprechend als Bedingung ergänzen musst.

                  z.B. alle Pfade die mit /maint/ beginnen

                  1. Hallo,

                    als erstes möchte ich mich für deine Hilfe und deine konstruktive Kritik bedanken. Ich hab das Problem nun wie folgt gelöst und es funktioniert auch wie ich mir das vorgestellt habe:

                    RewriteCond %{REMOTE_ADDR} !^123.456.789.123$
                    RewriteCond %{REQUEST_URI} !^/maint/(.*)$ [NC]
                    RewriteRule ^(.*)$ http://example.com/maint/index.html [R=307,NC,L]

                    LG
                    Claudia

                    1. Ich hab das Problem nun wie folgt gelöst und es funktioniert auch wie ich mir das vorgestellt habe:

                      RewriteCond %{REMOTE_ADDR} !^123.456.789.123$

                      Sieht gut aus. Für Beispiel-IP-Adressen gibt es übrigens RFC 5735. Bei der Von dir gegebenen besteht aber ohnehin keine Gefahr, dass sie real existiert.

                      RewriteCond %{REQUEST_URI} !^/maint/(.*)$ [NC]

                      RewriteCond %{REQUEST_URI} !^/maint/

                      Sollte denselben Zwecke erfüllen.

                      Das [NC] kannst du dir sparen, wenn du dir sicher bist, dass es maint und nicht MainT oder Maint oder mainT oder ähnliches ist.

                      (.*)$ kannst du ebenfalls sparen - ob etwas mit einer bestimmten Zeichenkette beginnt oder ob bis zu Ende eine bestimmte Zeichenkette (oder nichts) folgt ist egal. Entscheidend wäre der Unterschied nur, wenn du das was dahinter kommt später weiterverwenden möchtest.

                      RewriteRule ^(.*)$ http://example.com/maint/index.html [R=307,NC,L]

                      Das NC-Flag ist auch hier nicht nötig, du matcht im Ausdruck ohnehin ^(.*)$ - und bei "irgendwas" ist Groß- und Kleinschreibung egal.

                      Eigentlich kannst du den Ausdruck auch auf .* reduzieren, die Klammern und das ^ String-Anfang und String-Ende $ machen den Ausdruck nur komplizierter und performancelastiger. Das ist zwar in diesem Fall vernachlässigbar, wenn du aber in einer 20-MB-Datei nach Zeichenketten suchst, sind solche Optimierungen oft starke Performancebringer.

  2. Hi,

    RewriteCond %{REMOTE_ADDR} !^123.456.789.123$
            RewriteRule ^(.*)$ \http://www.subdomain.firma.de/maint/index.html [R=302,L]

    Mit der oben vorgestellten Konfiguration, bekomme ich eine Fehlermeldung: "Die weiterleitung würde nie beendet werden".
    Was ich komisch finde, wenn ich aber eine andere Afresse in der RewriteRule eintrage, wie z.B.: www.heise.de, dann fuktioniert die Weiterleitung? Was läuft da falsch?

    Du schickst jemanden, der etwas von unterhalb der Domain example.com* anfordert, und dabei die „falsche“ IP-Adresse hat, stattdessen etwas von example.com holen.

    Was dann im nächsten Schritt passiert, sollte ja wohl logisch sein:
    Du schickst jemanden, der etwas von unterhalb der Domain example.com* anfordert, und dabei die „falsche“ IP-Adresse hat, stattdessen etwas von example.com holen.

    ...

    * Bitte benutze für Beispiele vorgesehene Domains wie example.com/.net/.org, und keine potentiell existierenden Fremddomains.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?