rolf: htaccess RewriteRule dauerlauf für weiterleitung

Hallo,
hab ein problem bei folgender einstellung meiner htaccess:
RewriteEngine on
RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
RewriteCond %{HTTP_REFERER} bösedomain.ru [OR]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule /* http://www.meinedomain.de/index.html [R,L]

Wenn ich eine beliebigen nicht existierenden namen bzw. ne datei auf meinem server aufruf der nicht existiert, dann leitet er es korrekt auf die index.html seite

wenn aber der refferer von bösedomain.com kommt, dann scheint er in einen dauerlauf zu kommen bis er (browser+server) schliesslich abbricht.
Mit dem [NC] flag gehts jedenfalls nicht zumindest mit dem refferer.
Er sollte jedesmal den referer prüfen von den 3 angegebenen domains und gegebenfalls auf die welcome seite weiterleiten.
Könnte es eventuell am rewriterule liegen? Müssen es 2 Rewrite rules sein, auch wenn bei allen 4 möglichkeiten dasselbe getan werden müsste?
Rolf

P.S. Hab da schon einiges gefunden hier und bei apache , aber dort ist mir der rewrite rule zu kompliziert ^(.*).htm$ $1.html. Gehts vielleicht einfacher als mit den x-beliebigen zeichen ? Will doch nur ne x beliebige anfrage von ner bestimmten domain bzw. bei nicht vorhandener datei umleiten, das ist alles.

  1. Hallo rolf,

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
    RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
    RewriteCond %{HTTP_REFERER} bösedomain.ru [OR]
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule /* http://www.meinedomain.de/index.html [R,L]

    Die RewriteRule dürfte so eigentlich nicht korrekt sein, denn die wird ja durch einen regulären Ausdruck beschrieben, siehe auch Apache Module mod_rewrite RewriteRule Directive.
    /* würde also auf _ (nichts), /, //, ///, ///, ... matchen - und sonst auf nichts. Und das ist nach Deinen Beschreibungen nicht das, was Du willst. Du willst vermutlich eher /(.*).

    Wenn ich eine beliebigen nicht existierenden namen bzw. ne datei auf meinem server aufruf der nicht existiert, dann leitet er es korrekt auf die index.html seite

    Warum er das tut wundert mich jetzt, aber egal ... ah ok, kurz nachgelesen, das macht also diese !-s.

    wenn aber der refferer von bösedomain.com kommt, dann scheint er in einen dauerlauf zu kommen bis er (browser+server) schliesslich abbricht.

    Könnte es eventuell am rewriterule liegen? Müssen es 2 Rewrite rules sein, auch wenn bei allen 4 möglichkeiten dasselbe getan werden müsste?

    Nein, eine Regel sollte reichen, nur scheint mir die Regel nicht ganz korrekt zu sein.
    Du könntest aber die RewriteConds für den Referrer auf eine verkürzen, indem du ((domain1.tld)|(domain2.tld)|(domain3.tld)) schreibst, aber das dürfte nicht das Problem hier sein.

    [...] ^(.*).htm$ $1.html. Gehts vielleicht einfacher als mit den x-beliebigen zeichen? [...]

    Naja so kompliziert ist das nun auch nicht. ^ markiert den Anfang des Strings, (.*) ein beliebiges Zeichen, das keinmal oder beliebig oft vorkommt auf das ein .htm folgt, $ markiert das Ende des Strings und $1.html schreibt eben (.*) vor .html - aber müßten da nicht die "." escaped werden? Und wenn du auf "x-beliebige Zeichen" matchen willst, muß Dein Pattern eben auch "x-beliebige Zeichen" zulassen, also (.*).

    Wo genau Dein Fehler liegt konnte ich Dir jetzt zwar nicht sagen, aber zumindest konnte ich Dir sagen, daß Deine RewriteRule wohl nicht den Ausdruck beschreibt, den Du beschreiben willst.

    Schonmal ins Error-Log geschaut? Da stehen manchmal hilfreiche Meldungen drin, vor allem auch bei mod_rewrite-Fehlern.

    Grüße aus Karlsruhe,
    Götz

    --
    Losung für Mittwoch, 6. September 2006
    Des Menschen Geist muss davon, und er muss wieder zu Erde werden; dann sind verloren alle seine Pläne. (Psalm 146,4)
    Selig sind die Toten, die in dem Herrn sterben von nun an. Ja, spricht der Geist, sie sollen ruhen von ihrer Mühsal; denn ihre Werke folgen ihnen nach. (Offenbarung 14,13)
    (Losungslink)
    1. Die RewriteRule dürfte so eigentlich nicht korrekt sein, denn die wird ja durch einen regulären Ausdruck beschrieben, siehe auch Apache Module mod_rewrite RewriteRule Directive.
      /* würde also auf _ (nichts), /, //, ///, ///, ... matchen - und sonst auf nichts.

      Nein, die RegEx ist nach allen Seiten hin offen, sie matched jeden Request. Ein einfaches ^ zu notieren dürfte aber effizinter sein.

      Du hast ein OR-Flag zu viel.

      RewriteEngine on
      RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.ru
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule ^  http://www.meinedomain.de/index.html [R,L]

    2. Hallo Götz + Bob,

      RewriteEngine on
      RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.ru [OR]
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule /* http://www.meinedomain.de/index.html [R,L]

      Die RewriteRule dürfte so eigentlich nicht korrekt sein, denn die wird ja durch einen regulären Ausdruck beschrieben, siehe auch Apache Module mod_rewrite RewriteRule Directive.

      Ja die hab ich auch durchgelesen, bin aber nicht schlauer geworden.

      /* würde also auf _ (nichts), /, //, ///, ///, ... matchen - und sonst auf nichts. Und das ist nach Deinen Beschreibungen nicht das, was Du willst. Du willst vermutlich eher /(.*).

      geht nicht, hab dann
      RewriteRule /(.*).* http://www.meinedomain.de/index.html [R,L]
      probiert was den selbigen effekt hatte wie z.b. auch
      RewriteRule ^.*$ http://www.meinedomain.de/index.html [R,L]
      einen abruch der übertragung und ne leere seite.
      In der statuszeile vom browser sah ich, dass er immer wieder versuchte zu verbinden.
      Habe dann auf eine andere domain umgeleitet, was dann funktionierte.
      Auf die eigene domain weiter zu leiten geht mit dem refer nicht.

      @Bob, wenn ich ein [OR] weglasse also z.B. so
      RewriteEngine on
      RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.ru
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule ^.*$ http://www.meinedomain.de/index.html [R,L]

      dann gehts auch nicht, er leitet nicht weiter zeigt stattdessen die angeforderte datei zumindest wenn der referer von bösedomain.ru kommt.

      [...] ^(.*).htm$ $1.html. Gehts vielleicht einfacher als mit den x-beliebigen zeichen? [...]

      Naja so kompliziert ist das nun auch nicht. ^ markiert den Anfang des Strings, (.*) ein beliebiges Zeichen, das keinmal oder beliebig oft vorkommt

      warum die klammern?

      auf das ein .htm folgt, $ markiert das Ende des Strings und $1.html schreibt eben (.*) vor .html - aber müßten da nicht die "." escaped werden? Und wenn du auf "x-beliebige Zeichen" matchen willst, muß Dein Pattern eben auch "x-beliebige Zeichen" zulassen, also (.*).

      ich dachte (.*).*

      Wo genau Dein Fehler liegt konnte ich Dir jetzt zwar nicht sagen, aber zumindest konnte ich Dir sagen, daß Deine RewriteRule wohl nicht den Ausdruck beschreibt, den Du beschreiben willst.

      Schonmal ins Error-Log geschaut? Da stehen manchmal hilfreiche Meldungen drin, vor allem auch bei mod_rewrite-Fehlern.

      hab ich, keine fehlermeldung diesbezüglich.
      Hab das ganze auch auf meinem anderen server apache 2.xxx versucht , der reagiert auch so. Scheint also was falsch zu sein, aber nicht am server :-)
      Grüsse
      Rolf

      1. Hallo rolf,

        /* würde also auf _ (nichts), /, //, ///, ///, ... matchen - und sonst auf nichts. Und das ist nach Deinen Beschreibungen nicht das, was Du willst. Du willst vermutlich eher /(.*).

        RewriteRule /(.*).* http://www.meinedomain.de/index.html [R,L]
        RewriteRule ^.*$ http://www.meinedomain.de/index.html [R,L]

        Nun was ich schrieb war nicht ganz richtig, denn /* matcht natürlich _immer_, denn in einem Pfad ist eigentlich immer mindestens / drin und selbst wenn nicht, paßt der Ausdruck. Was ihn natürlich nicht "richtiger" macht.
        Dein Problem ist wohl, daß Du Dich mit regulären Ausdrücken nicht auskennst, das solltest Du Dir irgendwo anlesen.
        (.*).* trifft auf alles, was _ (nichts), ., .., ..., .... usw. enthält zu - das zweite ".*" bringt nichts.
        ^.*$ trifft auf _ (nichts), ., .., ..., usw. zu - aber nur auf genau diese Zeichenketten.

        Aber zurück zu Deiner eigentlichen Frage: MudGuard hat das Problem ganz gut beschrieben.

        Grüße aus Karlsruhe,
        Götz

        --
        Losung für Mittwoch, 6. September 2006
        Des Menschen Geist muss davon, und er muss wieder zu Erde werden; dann sind verloren alle seine Pläne. (Psalm 146,4)
        Selig sind die Toten, die in dem Herrn sterben von nun an. Ja, spricht der Geist, sie sollen ruhen von ihrer Mühsal; denn ihre Werke folgen ihnen nach. (Offenbarung 14,13)
        (Losungslink)
        1. Hallo,

          Nun was ich schrieb war nicht ganz richtig, denn /* matcht natürlich _immer_, denn in einem Pfad ist eigentlich immer mindestens / drin und selbst wenn nicht, paßt der Ausdruck. Was ihn natürlich nicht "richtiger" macht.
          Dein Problem ist wohl, daß Du Dich mit regulären Ausdrücken nicht auskennst, das solltest Du Dir irgendwo anlesen.
          (.*).* trifft auf alles, was _ (nichts), ., .., ..., .... usw. enthält zu - das zweite ".*" bringt nichts.
          ^.*$ trifft auf _ (nichts), ., .., ..., usw. zu - aber nur auf genau diese Zeichenketten.

          Na dann bleibt es wohl bei ^/* oder ^/*.*
          Ja stimmt, versteh die logik von der apache doku nicht so ganz, was diese zeichenketten angehen, obwohl ich die einzelnen zeichen als solches verstehe, was sie zu bedeuten haben.

          Aber zurück zu Deiner eigentlichen Frage: MudGuard hat das Problem ganz gut beschrieben.

          Ja hab ich probiert, aber kein erfolg gehabt.
          So nun hab ich es mal anders probiert mit 2-RewriteRules also so:
          RewriteEngine on
          RewriteCond %{HTTP_REFERER} ((böseseite.com)|(böseseite.net)|(böseseite.ru))
          RewriteRule ^/*.* http://meineanderedomain.de/notfound.html [R,L]
          RewriteCond %{REQUEST_FILENAME} !-s
          RewriteRule ^/* http://www.meinedomain.de/index.html [R,L]

          und so gehts kommischerweise.
          MfG
          Rolf

        2. Hallo Götz,

          Dein Problem ist wohl, daß Du Dich mit regulären Ausdrücken nicht auskennst, das solltest Du Dir irgendwo anlesen.

          Du aber scheins auch nicht ;)

          .* trifft auf jede beliebige Zeichenkette beliebiger Länge zu, denn der Punkt steht für ein beliebiges Zeichen.
          .* trifft auf _ , ., .., ..., etc. zu.

          (.*).* trifft auf alles, was _ (nichts), ., .., ..., .... usw. enthält zu - das zweite ".*" bringt nichts.
          ^.*$ trifft auf _ (nichts), ., .., ..., usw. zu - aber nur auf genau diese Zeichenketten.

          Viele Grüße aus Freiburg,
          Marian

          --
          Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
          <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
          1. Hallo Marian,

            Du aber scheins auch nicht ;)

            jaja, Du hast natürlich Recht, auch . ist ein besonderes Zeichen und müßte maskiert werden, wenn man den "." als Zeichen meint. :)

            Grüße aus Karlsruhe,
            Götz

            --
            Losung für Donnerstag, 7. September 2006
            Wer bereitet dem Raben die Speise, wenn seine Jungen zu Gott rufen und irrefliegen, weil sie nichts zu essen haben? (Hiob 38,41)
            Es ist nicht recht, dass wir für die Mahlzeiten sorgen und darüber das Wort Gottes vernachlässigen. (Apostelgeschichte 6,2)
            (Losungslink)
  2. Hi,

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
    RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
    RewriteCond %{HTTP_REFERER} bösedomain.ru [OR]
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule /* http://www.example.org/index.html [R,L]

    1.  Der Request kommt also mit bösem Referer.
    2. Der wird _extern_ umgeleitet auf http://www.example.org/index.html (Beispieldomains sollten die dafür vorgesehenen example.net, example.org, example.com sein, nicht existente Domains, die Dir nicht gehören - oder arbeitest Du für Schlund und Partner?)

    3. Der Browser wird also einen _neuen_ Request abschicken - da es sich um eine Weiterleitung handelt, mit demselben Referer.

    4. Apache wird also erkennen, daß eine der Bedingungen für böse Referer zutrifft, und die externe Umleitung auf http://www.example.org/index.html vornehmen.

    5. Jetzt geht es weiter mit Schritt 3.

    Abhilfe:
    Leite nicht extern, sondern nur intern um auf /index.html
    Dann müßte das L-Flag auch greifen.
    Wenn nicht, füge noch eine Bedingung hinzu, daß die URL nicht /index.html sein darf.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. hallo,

      RewriteEngine on
      RewriteCond %{HTTP_REFERER} bösedomain.com [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.net [OR]
      RewriteCond %{HTTP_REFERER} bösedomain.ru [OR]
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule /* http://www.example.org/index.html [R,L]

      1.  Der Request kommt also mit bösem Referer.
      2. Der wird _extern_ umgeleitet auf http://www.example.org/index.html (Beispieldomains sollten die dafür vorgesehenen example.net, example.org, example.com sein, nicht existente Domains, die Dir nicht gehören - oder arbeitest Du für Schlund und Partner?)

      Ja, eine domain von mir ist bei Schlund und Partner oder 1+1 und die andere auf einem österreichischen, welche beide den bösen referer von einer bösen-seite haben. Hab damit ein traffic problem, aber das ist ja nicht das thema.

      1. Der Browser wird also einen _neuen_ Request abschicken - da es sich um eine Weiterleitung handelt, mit demselben Referer.

      Ja mit dem referer der bösen domain, nicht von meiner.

      1. Apache wird also erkennen, daß eine der Bedingungen für böse Referer zutrifft, und die externe Umleitung auf http://www.example.org/index.html vornehmen.

      2. Jetzt geht es weiter mit Schritt 3.

      Abhilfe:
      Leite nicht extern, sondern nur intern um auf /index.html
      Dann müßte das L-Flag auch greifen.

      Ja ich denke auch dass der L-Flag nicht greift.
      Mit der internen umleitung gehts genau so nicht übrigens
      RewriteEngine on
      RewriteCond %{HTTP_REFERER} böseseite.com [OR]
      RewriteCond %{HTTP_REFERER} böseseite.net [OR]
      RewriteCond %{HTTP_REFERER} böseseite.ru [OR]
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule ^.*$ /index.html [R,L]

      habe noch nicht erwähnt dass ich unterhalb von RewriteRule noch einen eintrag habe
      RewriteRule ^.*$ /index.html [R,L]
      deny from 66.196.90.
      deny from 81.176.228.

      Könnte das eventuell damit zu tun haben?

      Wenn nicht, füge noch eine Bedingung hinzu, daß die URL nicht /index.html sein darf.

      Also eine andere datei als index.html bei einer internen umleitung?
      Was ich komisch finde ist dass er bei
      RewriteCond %{REQUEST_FILENAME} !-s
      richtig umleitet und bei treffendem HTTP_REFERER die seite nicht bringt, die im RewriteRule steht.
      Rolf

      1. hi,

        Leite nicht extern, sondern nur intern um auf /index.html
        Dann müßte das L-Flag auch greifen.

        Ja ich denke auch dass der L-Flag nicht greift.

        Es kann nicht greifen, weil durch den Redirect ein vollkommen neuer, unabhängiger Request ausgelöst wird - und damit die _komplette_ von vorne losgeht.

        Mit der internen umleitung gehts genau so nicht übrigens
        RewriteRule ^.*$ /index.html [R,L]

        Da du explizit das Flag R für Redirect setzt, ist das immer noch keine _interne_ Umschreibung - es passiert nach wie vor das gleiche, es wird durch den Redirect ein vollkommen neuer, unabhängiger Request ausgelöst.

        habe noch nicht erwähnt dass ich unterhalb von RewriteRule noch einen eintrag habe
        deny from 66.196.90.
        deny from 81.176.228.

        Könnte das eventuell damit zu tun haben?

        Nein. Diese Direktiven betreffen das Modul mod_access, nicht mod-rewrite.

        gruß,
        wahsaga

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

          Leite nicht extern, sondern nur intern um auf /index.html
          Dann müßte das L-Flag auch greifen.

          Ja ich denke auch dass der L-Flag nicht greift.

          Es kann nicht greifen, weil durch den Redirect ein vollkommen neuer, unabhängiger Request ausgelöst wird - und damit die _komplette_ von vorne losgeht.

          Also ohne R-flag und ohne L-flag gehts auch nicht, die reaktion vom server ist dieselbe wie mit und nur wegen dem referer cont.

          Mit der internen umleitung gehts genau so nicht übrigens
          RewriteRule ^.*$ /index.html [R,L]

          Da du explizit das Flag R für Redirect setzt, ist das immer noch keine _interne_ Umschreibung - es passiert nach wie vor das gleiche, es wird durch den Redirect ein vollkommen neuer, unabhängiger Request ausgelöst.

          Wenn ich den redirect intern versuche, dann kommt ein 500error wegen
          maximum number of internal redirects reached
          und weiter steht im errorlog
          Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary

          Rolf

          1. Hallo Rolf,

            und weiter steht im errorlog
            Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary

            Na also, Problem gelöst!

            Viele Grüße aus Freiburg,
            Marian

            --
            Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
            <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->