Thoralf Knuth: RewriteEngine auf Apache/1.3.26 (WinXP)

Hallo allerseits,

ich zweifle grad mal wieder an meiner Intelligenz.
Ich möchte aus:

http://www.example.de/a/b/c/d
http://www.example.de/index.php?uri=/a/b/c/d

machen. Ich bastel jetzt eine Weile an der RewriteEngine rum und zweifle an meiner Intelligenz. LogLevel steht auf debug, vermeldet aber nichts. Ich beginne mittlerweile sogar zu zweifeln, ob die RewriteEngine überhaupt läuft. In httpd.conf hab ich die 'entkommentiert':

LoadModule rewrite_module modules/mod_rewrite.so
und
AddModule mod_rewrite.c

Meine .htaccess im betreffenden vHost sieht aus wie folgt:

RewriteEngine on
RewriteRule /(.*) /index.php?uri=$1

Flags hab ich erstmal ganz raus zum reinen Testen.
Rufe ich /index.php auf, bekomme ich die und im Log den Aufruf.
Rufe ich /a auf, bekomme ich statt /index.php?uri=/a einfach nur einen 404, und auch nur den im Log.

Seht Ihr einen Fehler? Gibt es eine Möglichkeit, sicher festzustellen, ob mod_rewrite wirklich geladen wurde? Gestoppt, gestartet und neu gestartet hab ich den Indianer schon mehr als nur einmal.

Gruß, Thoralf

--
Sic Luceat Lux!
  1. Hallo Thoralf,

    ich zweifle grad mal wieder an meiner Intelligenz.

    [...] ;)

    http://www.example.de/a/b/c/d
    http://www.example.de/index.php?uri=/a/b/c/d
    machen.

    Hmm... mehr nicht? ;-)

    Ich bastel jetzt eine Weile an der RewriteEngine rum und zweifle an meiner Intelligenz.

    Daran wird es bestimmt nicht liegen... eher an nicht-ganz-lesung des Manuals? ;-) Ach stimmt, du hast ja Apache1.3..., da gibts afaik nicht ein so gutes manual. Wieso nutzt du nicht Apache2?

    Ich beginne mittlerweile sogar zu zweifeln, ob die RewriteEngine überhaupt läuft. In httpd.conf hab ich die 'entkommentiert':
    LoadModule rewrite_module modules/mod_rewrite.so
    und
    AddModule mod_rewrite.c

    Hmm... in meinem Apachen 2.0.4 auf Win2k brauche ich lediglich

    LoadModule rewrite_module modules/mod_rewrite.so

    und mehr nicht.

    Meine .htaccess im betreffenden vHost sieht aus wie folgt:

    Im betreffenden vHost? KAnnst du das genauer erklären?

    RewriteEngine on

    "RewriteBase /" fehlt danach afaik.

    RewriteRule /(.*) /index.php?uri=$1

    und hier ... eher

    RewriteRule ^(.*)$ index.php?uri=$1

    Zumindest habe ich vergleichbares bei mir so eingebaut.

    Flags hab ich erstmal ganz raus zum reinen Testen.

    Und Flags habe ich für diese simple Aufgabe auch nicht benötigt ;-)

    Seht Ihr einen Fehler? Gibt es eine Möglichkeit, sicher festzustellen, ob mod_rewrite wirklich geladen wurde? Gestoppt, gestartet und neu gestartet hab ich den Indianer schon mehr als nur einmal.

    Probier es mal mit den von mir vorgeschlagenen dingen, dann sehen wir weiter :)

    WauWau

    --
    ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
    E-Mail WauWau: [mailto:der-wauwau@gmx.de]
    1. Hallo WauWau,

      ich zweifle grad mal wieder an meiner Intelligenz.
      [...] ;)

      ^^

      Hmm... mehr nicht? ;-)

      Mehr ist das nicht, dachte ich auch. ;)

      Ich bastel jetzt eine Weile an der RewriteEngine rum und zweifle an meiner Intelligenz.
      Daran wird es bestimmt nicht liegen... eher an nicht-ganz-lesung des Manuals? ;-) Ach stimmt, du hast ja Apache1.3..., da gibts afaik nicht ein so gutes manual. Wieso nutzt du nicht Apache2?

      Weil mein Hoster auf Apache 1.3.x läuft. :)

      Hmm... in meinem Apachen 2.0.4 auf Win2k brauche ich lediglich
      LoadModule rewrite_module modules/mod_rewrite.so

      Die zweite Stelle steht weiter unten und muss zumindest beim 1.3.x zwingend mit vorhanden sein.

      Meine .htaccess im betreffenden vHost sieht aus wie folgt:
      Im betreffenden vHost? KAnnst du das genauer erklären?

      Ich hab in der Root von dem betreffenden Host eine .htaccess mit der RewriteRule drin.

      RewriteEngine on
      "RewriteBase /" fehlt danach afaik.

      Ändert nichts.

      RewriteRule /(.*) /index.php?uri=$1
      und hier ... eher
        RewriteRule ^(.*)$ index.php?uri=$1

      Jagt lokal den Apache auf 100% Proz-Auslastung und das lässt sich auch durch Restarten und manuelles Killen nicht beheben. Danach muss ich das System neu starten, damit das geht. Ich hatte den Server mit obiger Rule am Laufen, nur wurde dann eben aus
      http://www.example.de/a/b/c/d
      http://www.example.de/index.php?uri=b/c/d
      warum auch immer.

      Flags hab ich erstmal ganz raus zum reinen Testen.

      Hab bei Deinem Beispiel oben mit und ohne [L] probiert, ändert auch nichts.

      Seht Ihr einen Fehler? Gibt es eine Möglichkeit, sicher festzustellen, ob mod_rewrite wirklich geladen wurde? Gestoppt, gestartet und neu gestartet hab ich den Indianer schon mehr als nur einmal.
      Probier es mal mit den von mir vorgeschlagenen dingen, dann sehen wir weiter :)

      ;)

      Gruß, Thoralf

      --
      Sic Luceat Lux!
      1. Nachtrag:

        hab jetzt auch online auf Apache/1.3.29 auf Linux infong 2.4.21 (Was immer das ist ^^) getestet, gleiches Ergebnis:

        RewriteEngine on
        RewriteRule ^(.*)$ /bilder.php?uri=$1

        gibt mit und ohne

        RewriteBase /

        einen 500er. Auf's Errorlog darf ich bei Puretec nicht zugreifen. :(

        Nehme ich statt dessen

        RewriteEngine on
        RewriteRule /(.*) /bilder.php?uri=$1

        dann funktioniert's.

        Nur eben der Effekt:

        http://www.example.de/a/b/c/d
        http://www.example.de/index.php?uri=b/c/d

        Was mir auch logisch erscheint, Apache durchsucht a/b/c/d, und /(.*) matcht eben auf a/(b/c/d). Nur watt nu?

        Rauchzeichensendend, Thoralf

        --
        Sic Luceat Lux!
        1. Weiter geht's, hab das Problem weiter eingrenzen können:

          RewriteEngine on
          RewriteBase /

          RewriteRule ^(.*)$ /rewrite.php?uri=$1

          RewriteRule ^(.*)$ rewrite.php?uri=$1 [L]

          (rewrite.php statt /rewrite.php; bilder->rewrite nur wegen's der Ordnung; [L] um weiteres Ersetzen zu vermeiden, auch ohne [L] zeigt sich der beschriebene Effekt.)

          klappt, wie es soll, aber:
          In PHP teste ich dann die übergebeben Werte und da seh ich dann, dass er mir Schrott gibt:
          $_SERVER['SCRIPT_URI'] ist richtig mit http://www.example.org/a/b/c/d/ belegt
          $_GET['uri'] ist dann aber rewrite.php, also die Datei, in die Rewrite umstellt, nicht die Original-Request.

          Indianerzündelnd, Thoralf

          --
          Sic Luceat Lux!
          1. Hallo Thoralf,

            Weiter geht's, hab das Problem weiter eingrenzen können:

            ... ;-) ... kleine Konversation mit sich selbst ;-)

            RewriteRule ^(.*)$ /rewrite.php?uri=$1

            Hmm... ich habe immer noch nicht die geringste Ahnung, weswegen das dein System... ausgelastet hat ;-) Vielleicht das /rewrite.php?uri=$1 in anführungszeichen " ?....

            klappt, wie es soll, aber:
            In PHP teste ich dann die übergebeben Werte und da seh ich dann, dass er mir Schrott gibt:
            $_SERVER['SCRIPT_URI'] ist richtig mit http://www.example.org/a/b/c/d/ belegt
            $_GET['uri'] ist dann aber rewrite.php, also die Datei, in die Rewrite umstellt, nicht die Original-Request.

            Hmm... was hattest du denn in $_GET["uri"] erwartet? Also, ein Request

            server.tld/xy/z.htm?bla=blo

            müsste nach deiner Regelung etwa

            $_GET(
              uri => /xy/z.htm
             )

            ergeben. Falls deine Frage war, wie du an die eigentlichen HTTP-Umgebungsvariablen rankommst... z.B. die GET/POST-Vars:

            $POST = $_POST;
             parse_str(substr(strstr($_SERVER["REQUEST_URI"], "?"), 1), $GET);

            Nun ist $POST $_POST (;-) und $GET ist das ursprüngliche $GET.

            ODer wo besteht jetzt genau das Problem?

            Indianerzündelnd

            *g*

            WauWau

            --
            ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
            E-Mail WauWau: [mailto:der-wauwau@gmx.de]
            1. Hallo Wau,

              ... ;-) ... kleine Konversation mit sich selbst ;-)

              hilft manchmal und ist ja auch ne Möglichkeit, mehr Sichtweisen reinzubringen.

              RewriteRule ^(.*)$ /rewrite.php?uri=$1

              Hmm... ich habe immer noch nicht die geringste Ahnung, weswegen das dein System... ausgelastet hat ;-) Vielleicht das /rewrite.php?uri=$1 in anführungszeichen " ?....

              Wegen dem / im Ziel, das wäre wohl die lokale Laufwerks-Root und da darf der Indianer nicht hin.

              klappt, wie es soll, aber:
              In PHP teste ich dann die übergebeben Werte und da seh ich dann, dass er mir Schrott gibt:
              $_SERVER['SCRIPT_URI'] ist richtig mit http://www.example.org/a/b/c/d/ belegt
              $_GET['uri'] ist dann aber rewrite.php, also die Datei, in die Rewrite umstellt, nicht die Original-Request.

              Hmm... was hattest du denn in $_GET["uri"] erwartet? Also, ein Request
              server.tld/xy/z.htm?bla=blo
              müsste nach deiner Regelung etwa

              $_GET(
                uri => /xy/z.htm
              )

              genau so soll's sein. Nur steht da genau das nicht, sondern eben der Name des Scripts, was NACH der Rule aufgerufen wird, also bei mir rewrite.php .. und das versteh ich nicht.
              Bei obigem Beispiel müsste also, so wie Du auch sagst, uri=/a/b/c/d/ sein, es ist aber uri=rewrite.php UND DAS MACHT MICH WAHNSINNIG. *scnr*

              Falls deine Frage war [...]

              Natürlich kann ich die existierenden Servervariablen auswerten und das 'nachbessern', aber ich will das ja an die RewriteEngine abschieben. Wenn die schon RegExp durcharbeiten soll, dann doch bitte gleich richtig. Und bei allen anderen funktioniert das, so wie ich das verstanden hab. Nur auf meinem Server nicht und bei Puretec nicht. Und ich bin sicher, dass ich einen dummen Fehler irgendwo drin hab.

              Indianerzündelnd
              *g*

              Naja, mittlerweile feil ich mir grade ne Handgranate für meinen Indianer zurecht.

              Gruß, Thoralf

              --
              Sic Luceat Lux!
              1. Hallo Thoralf,

                RewriteRule ^(.*)$ /rewrite.php?uri=$1

                Hmm... ich habe immer noch nicht die geringste Ahnung, weswegen das dein System... ausgelastet hat ;-) Vielleicht das /rewrite.php?uri=$1 in anführungszeichen " ?....
                Wegen dem / im Ziel, das wäre wohl die lokale Laufwerks-Root und da darf der Indianer nicht hin.

                Ach so, stimmt, es ist ja Linux. Hmm... mein Apache2 auf Win2k sucht dann nach der Datei rewrite.php im eingestellten Root-Verzeichnis des Servers.

                Hmm... was hattest du denn in $_GET["uri"] erwartet? Also, ein Request
                server.tld/xy/z.htm?bla=blo
                müsste nach deiner Regelung etwa

                $_GET(
                  uri => /xy/z.htm
                )
                genau so soll's sein. Nur steht da genau das nicht, sondern eben der Name des Scripts, was NACH der Rule aufgerufen wird, also bei mir rewrite.php .. und das versteh ich nicht.
                Bei obigem Beispiel müsste also, so wie Du auch sagst, uri=/a/b/c/d/ sein, es ist aber uri=rewrite.php UND DAS MACHT MICH WAHNSINNIG. *scnr*

                Hmm... kleine Überlegung *überleg* ;-)

                Ein Request à "bla/blo/bli/ble/blu" kommt rein. Der Server leitet es zu request.php?uri=bla/blo/bli/ble/blu weiter (maskiert er die / richtig? ;-). Hierbei wir wiederum die rewrite-rule angeworfen, er leitet den Request "request.php" zu "request.php" weiter. Und auf wundersame weise wird nun mal wirklich request.php gestartet. Das wäre die einzige sinnvolle erklärung, die ich für dieses Phänomen hätte. Ist aber irgendwie ... unlogisch, könnte ich mir dementsprechend so nicht in der Praxis vorstellen.

                ^^^---- sorry, ich meinte nicht "request.php", sondern "rewrite.php" ;-)

                ansonsten ändere doch dementsprechend mal deinen Pattern zu ändern oder mache eine RewriteRule rein, die überprüft, ob der Request zu "rewrite.php" gehen soll und dann nicht das Rewrite-Zeugs macht.

                Natürlich kann ich die existierenden Servervariablen auswerten und das 'nachbessern', aber ich will das ja an die RewriteEngine abschieben.

                Hmm.... was willst du an sie abschieben? *nichtversteh*...

                Wenn die schon RegExp durcharbeiten soll, dann doch bitte gleich richtig.

                Nun, ein transparentes "darstellen" der "beiden" Umgebungsvariablen (einmal der des Originalrequests und einmal der des Requests von rewrite.php) kann es nicht. Es vermischt sie gewissermaßen.

                Und bei allen anderen funktioniert das, so wie ich das verstanden hab. Nur auf meinem Server nicht und bei Puretec nicht. Und ich bin sicher, dass ich einen dummen Fehler irgendwo drin hab.

                Böses Puretec. Ist doch so eine Tochterfirma von 1&1, oder? Kein wunder. Wie der Herr, so das Geschirr ;-) *scnr*

                Indianerzündelnd
                *g*
                Naja, mittlerweile feil ich mir grade ne Handgranate für meinen Indianer zurecht.

                Damals schoss man aber noch mit Schießpulver ;-)

                WauWau

                PS: Ich schau mir mal mein Posting an.... und muss sagen: Ein fürchterlicher Ausdruck. Die Ausdrucksweise ist völlig absurd und ... grauenhaft! Jaja, ich muss sie wirklich mal ernsthaft ändern. Das werde ich jetzt auch mal genauso ernsthaft tun. wirklich :)

                --
                ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
                E-Mail WauWau: [mailto:der-wauwau@gmx.de]
  2. Und weiter geht's, ;)

    mittlerweile hab ich die Einstellungen komplett reduziert, so dass nur noch folgendes in der .htaccess steht:

    Aufruf von http://localhost/a/b/c soll nach rewrite.php?uri=/a/b/c umgeschrieben werden

    RewriteEngine on
    RewriteBase /

    #  RewriteRule ^(.*)$ rewrite.php?uri=$1 [NE] # -> uri=rewrite.php
    #  RewriteRule ^(.*)$ rewrite.php?uri=$1 [last,qsappend,nosubreq] # -> uri=rewrite.php&uri=a/b/c
    #  RewriteRule ^(.*)$ rewrite.php?uri=$1 [nosubreq,last,qsappend] # -> uri=rewrite.php&uri=a/b/c
    #  RewriteRule ^(.*)$ rewrite.php?uri=$1 [last,nosubreq] # -> uri=rewrite.php

    RewriteRule ^(.*)$ rewrite.php?uri=$1 [nosubreq,last,qsappend]

    Im RewriteLog steht dann:

    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (3) [per-dir server_pfad/www/] add path-info postfix: server_pfad/www/a -> server_pfad/www/a/b/c
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (3) [per-dir server_pfad/www/] strip per-dir prefix: server_pfad/www/a/b/c -> a/b/c
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (3) [per-dir server_pfad/www/] applying pattern '^(.*)$' to uri 'a/b/c'
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (2) [per-dir server_pfad/www/] rewrite a/b/c -> rewrite.php?uri=a/b/c
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (3) split uri=rewrite.php?uri=a/b/c -> uri=rewrite.php, args=uri=a/b/c
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (3) [per-dir server_pfad/www/] add per-dir prefix: rewrite.php -> server_pfad/www/rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (2) [per-dir server_pfad/www/] trying to replace prefix server_pfad/www/ with /
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (5) strip matching prefix: server_pfad/www/rewrite.php -> rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (4) add subst prefix: rewrite.php -> /rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#6763b8/initial] (1) [per-dir server_pfad/www/] internal redirect with /rewrite.php [INTERNAL REDIRECT]
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (3) [per-dir server_pfad/www/] strip per-dir prefix: server_pfad/www/rewrite.php -> rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (3) [per-dir server_pfad/www/] applying pattern '^(.*)$' to uri 'rewrite.php'
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (2) [per-dir server_pfad/www/] rewrite rewrite.php -> rewrite.php?uri=rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (3) split uri=rewrite.php?uri=rewrite.php -> uri=rewrite.php, args=uri=rewrite.php&uri=a/b/c
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (3) [per-dir server_pfad/www/] add per-dir prefix: rewrite.php -> server_pfad/www/rewrite.php
    127.0.0.11 - - [25/Apr/2004:23:42:21 +0200] [127.0.0.11/sid#5d7fd8][rid#67b378/initial/redir#1] (1) [per-dir server_pfad/www/] initial URL equal rewritten URL: server_pfad/www/rewrite.php [IGNORING REWRITE]

    An dieser Stelle werfe ich mal ein herzhaftes WTF?! ins Forum. Ich habe nichtmal mehr eine Idee, was ich noch testen soll/kann/muss.

    Gruß, Thoralf

    --
    Sic Luceat Lux!