Klaus: Mod_Rewrite - Wo liegt der Fehler?

Hallo!

Ich beschäftige mich gerade zum ersten Mal mit Mod_Rewrite.
Ich habe auf meinem Server im Unterverzeichnis "/test" zwei Dateien.
Eine inhaltsleere index.php und eine .htaccess-Datei mit folgendem Inhalt:

RewriteEngine On
RewriteRule ^/([a-z]+)/([a-z]+).html$ /index.php?kategorie=$1&seite=$2

Wenn ich nun den Auruf "/test/hallo/welt.html" mache, sollte der Server zwar dies in der Adressleiste anzeigen, im Hintergrund allerdings "index.php?kategorie=hallo&seite=welt" aufrufen.

Was in meinem Fall allerdings passiert ist, dass ein Error 404 ausgelöst wird.

Wo liegt der Fehler?

Viele Grüße
Klaus

  1. Lieber Klaus,

    im Unterverzeichnis "/test" zwei Dateien.
    Eine inhaltsleere index.php und eine .htaccess-Datei

    also sieht es so aus:
    [document root]
        |
        +-- test
              |
              +-- .htaccess
              +-- index.php

    Document Root enthält nix. Auch keine index.php oder sonstige Datei. Es enthält lediglich ein Unterverzeichnis "test", stimmt's?

    RewriteEngine On
    RewriteRule ^/([a-z]+)/([a-z]+).html$ /index.php?kategorie=$1&seite=$2

    "/test/hallo/welt.html"

    führt zu "/index.php?kategorie=hallo&seite=welt", will also im Document Root eine Datei namens index.php (mit zwei Parametern) aufrufen...

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,
      danke schonmal für die Antwort.

      also sieht es so aus:
      [document root]
          |
          +-- test
                |
                +-- .htaccess
                +-- index.php

      So sieht es aus.

      Document Root enthält nix. Auch keine index.php oder sonstige Datei. Es enthält lediglich ein Unterverzeichnis "test", stimmt's?

      Nein. Im übergeordneten Verzeichnis befinden sich ebenfalls Datein, unter anderem eine index.php.

      führt zu "/index.php?kategorie=hallo&seite=welt", will also im Document Root eine Datei namens index.php (mit zwei Parametern) aufrufen...

      Hier gilt also _nicht_ der Pfad, von der .htaccess aus?

      Viele Grüße
      Klaus

      1. Hallo Klaus,

        führt zu "/index.php?kategorie=hallo&seite=welt", will also im Document Root eine Datei namens index.php (mit zwei Parametern) aufrufen...
        Hier gilt also _nicht_ der Pfad, von der .htaccess aus?

        äh, doch schon ... aber du adressierst ja mit dem vorangestellten "/" ausdrücklich vom Document Root aus.

        So long,
         Martin

        --
        Zum Glück ist alles nur halb so doppelt.
  2. echo $begrüßung;

    RewriteEngine On
    RewriteRule ^/([a-z]+)/([a-z]+).html$ /index.php?kategorie=$1&seite=$2

    Wenn ich nun den Auruf "/test/hallo/welt.html" mache, sollte der Server zwar dies in der Adressleiste anzeigen, im Hintergrund allerdings "index.php?kategorie=hallo&seite=welt" aufrufen.
    Was in meinem Fall allerdings passiert ist, dass ein Error 404 ausgelöst wird.
    Wo liegt der Fehler?

    Er ruft nicht index.php auf sondern /index.php, so wie du es ihm gesagt hast. Vermutlich gibt es keine /index.php, deswegen der 404.

    Wenn du nun einfach den / rausmachst, kommst du in eine Endlosschleife, da RewriteRule in einer Per-Verzeichnis-Konfiguration einen neuen internen Request auslöst, der seinerseite wieder die Regeln des Verzeichnisses beachtet. Schließe durch zwei RewriteCond-Anweisungen existierende Dateien und Verzeichnisse vom Umschreiben aus.

    RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f

    echo "$verabschiedung $name";

    1. Hallo,
      danke für die Antwort.

      Er ruft nicht index.php auf sondern /index.php, so wie du es ihm gesagt hast. Vermutlich gibt es keine /index.php, deswegen der 404.

      Mir ist da ehrlich gesagt im Moment der Unterschied nicht klar.

      Wenn du nun einfach den / rausmachst, kommst du in eine Endlosschleife, da RewriteRule in einer Per-Verzeichnis-Konfiguration einen neuen internen Request auslöst, der seinerseite wieder die Regeln des Verzeichnisses beachtet. Schließe durch zwei RewriteCond-Anweisungen existierende Dateien und Verzeichnisse vom Umschreiben aus.

      Ich hab die Endlosschleife provoziert, sieht allerdings nicht so aus, als würde es was ändern, wenn ich den "/" rausnehme, weiterhin 404. :(

      RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f

      Bringt dann natürlich leider auch nichts...

      Viele Grüße
      Klaus

    2. Hi,

      RewriteEngine On
      RewriteRule ^/([a-z]+)/([a-z]+).html$ /index.php?kategorie=$1&seite=$2

      Wenn ich nun den Auruf "/test/hallo/welt.html" mache,

      ^/ matcht den /
      Das erste ([a-z]+) matcht 'test'
      / matcht den /
      Das zweite ([a-z]+) matcht das 'hallo'
      . matcht nicht, da jetzt ein / kommt, kein Punkt.

      Die Regel kann also nicht angewendet werden, die URL bleibt unverändert.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      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.
  3. Hallo!

    Also, wenn ich die .htaccess in das Root-Verzeichnis lege und folgende Angaben mache, funktioniert alles, so wie ich es will:

    RewriteEngine On
    RewriteRule ^/test/([a-z]+)/([a-z]+).html$ /test/index.php?kategorie=$1&seite=$2

    Zugegeben, verwirrt bin ich nachwievor.
    Kann mir jemand erklären, warum das jetzt funktioniert und vorhin nicht?

    Viele Grüße
    Klaus

    1. Hi,

      Also, wenn ich die .htaccess in das Root-Verzeichnis lege und folgende Angaben mache, funktioniert alles, so wie ich es will:

      RewriteEngine On
      RewriteRule ^/test/([a-z]+)/([a-z]+).html$ /test/index.php?kategorie=$1&seite=$2

      Zugegeben, verwirrt bin ich nachwievor.
      Kann mir jemand erklären, warum das jetzt funktioniert und vorhin nicht?

      Weil der Slash auf die Domainwurzel verweist.

      /test/index.php existiert.
      Vorher hast du, zwar aus der .htaccess im Unterverzeichnis test heraus, ebenfalls mit einem Slash beginnend umgeschrieben - /index.php. Eben durch diesen Slash bezieht sich das aber auch wieder auf das Wurzelverzeichnis, du "springst" damit also aus dem Unterverzeichnis heraus ins oberste Verzeichnis.

      MfG ChrisB