Schorsch: mod_rewrite Konzept SEF

Guten Tag

Du gibst im Browser folgend URL ein:
  /haus/kueche/tisch.html

Intern soll die URL mit mod_rewrite hierhin umgeleitet werden:
  /index.php?a=1&b=2&c=3

Jetzt habe ich ein Problem:
Nur die Datenbank selber kennt die ID's und weiss,
dass z.B. der Tisch die ID 3 besitzt.

Folglich muss ich noch eine Datenbankabfrage einbauen.
Ich habe mir das so vorgestellt:

Du gibst im Browser folgend URL ein:
  /haus/kueche/tisch.html

Per mod_rewrite wird die URL vorerst so umgeleitet:
  /idfinder.php?arg1=haus&arg2=kueche&arg3=tisch

Der idefinder macht nun die Datenbankabfrage.
Er findet die ID's heraus und weiss, dass der tisch die ID 3 hat.

Nun kann der idfinder mit
  header('location:index.php?a=1&b=2&c=3);

die entsprechende Seite aufrufen.

Frage

Ist das der Richtige Ansatz?
Geht das nicht mit weniger DB-Abfragen?
Wie macht das Joomla (SEF-Komponente)?

Gruss
Schorsch

  1. echo $begrüßung;

    Du gibst im Browser folgend URL ein:
      /haus/kueche/tisch.html
    Intern soll die URL mit mod_rewrite hierhin umgeleitet werden:
      /index.php?a=1&b=2&c=3

    Das ist im Prinzip nicht nötig. Von mod_rewrite ist es zwar machbar, aber nur wenn man RewriteMap mit einem "External Rewriting Program" nutzen kann, was aber beim Massenhoster im Allgemeinen nicht möglich ist.

    Nur die Datenbank selber kennt die ID's und weiss, dass z.B. der Tisch die ID 3 besitzt. Folglich muss ich noch eine Datenbankabfrage einbauen.

    Das ist auf mod_rewrite-Ebene nicht unbedingt nötig. Alternativvorschlag: Mit mod_rewrite lässt du nur sämtliche Zugriffe, die keine real existierenden Dateien und Verzeichnisse abfragen (Stichwort RewriteCond), auf die index.php umleiten. Das eingegebene /haus/kueche/tisch (das .html würde ich weglassen) hängst du an das index.php an. Es ergibt sich dann /index.php/haus/kueche/tisch. Der Apache findet die index.php und übergibt die Abarbeitung des Requests an ebendieses Script. Innerhalb dessen kannst du mittels $_SERVER['PATH_INFO'] auf das Anhängsel zugreifen, und deine IDs ermitteln (falls das wirklich notwendig ist. Möglicherweise kann man direkt die Stringwerte in eine (verknüpfte) SQL-Abfrage einbauen. (Absichern gegen SQL-Injection nicht vergessen))

    echo "$verabschiedung $name";

    1. Salut dedlfix

      Besten Dank!
      Ich versuche das mal umzusetzen:

      Mit mod_rewrite lässt du nur sämtliche Zugriffe, die keine real existierenden Dateien und Verzeichnisse abfragen

      Dazu habe ich folgende Zeilen gefunden:

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

      index.php umleiten.

      Da bin ich mir nicht ganz sicher. In Joomla fand ich:

      RewriteRule (.*) index.php

      Laut dem, was ich gelesen hab, müsste es heissen:

      ^(.*) index.php

      Wenn ich das Ganze laufen lasse, bekomme ich leider einen
      Internal Server Error.

      Ich habe meine htaccess Datei in einem Unterordner.
      Kommt da RewriteBase / ins Spiel?

      Stimmt mein Ansatz?

      Gruss
      Schorsch

      1. echo $begrüßung;

        Mit mod_rewrite lässt du nur sämtliche Zugriffe, die keine real existierenden Dateien und Verzeichnisse abfragen
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        Passt.

        index.php umleiten.
          RewriteRule (.*) index.php

        Passt eigentlich auch. Ich hab noch [L,QSA] hintendran hängen.

        Auf die Art gibt es aber kein PATH_INFO, da (.*) verloren geht, und auch die ()-Klammern können dabei entfallen. Die aufgerufene URL steht nun in $_SERVER['REQUEST_URI'].

        Wenn ich das Ganze laufen lasse, bekomme ich leider einen
        Internal Server Error.

        Welche Apache-Version steht dir zur Verfügung? Mit Version 2.0 funktioniert das so. Version 1.3 verhält sich beim Rewriten manchmal etwas anders, das mag lieber (wenn ich mich recht erinnere) absolute Pfade.

        echo "$verabschiedung $name";

        1. Salut

          Tatsächlich. Das ganze ist ja gar nicht so schwer!

          RewriteEngine On
          RewriteBase /testordner/
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteRule (.*) index.php [L,QSA]

          Und mit $_SERVER['REQUEST_URI'] habe ich Zugriff auf die effektiv eingegebene URL und kann damit arbeiten.

          Super, besten Dank!

          Schorsch

  2. hi,

    Der idefinder macht nun die Datenbankabfrage.
    Er findet die ID's heraus und weiss, dass der tisch die ID 3 hat.

    Nun kann der idfinder mit
      header('location:index.php?a=1&b=2&c=3);
    die entsprechende Seite aufrufen.

    Das ist - abgesehen vom Fehler, dass du keinen vollständigen URL inkl. Protokoll angegeben hast - reichlich blödsinnig, weil dadurch der Browser jetzt wieder .../index.php?a=1&b=2&c=3 in der Adresszeile anzeigen würde.

    gruß,
    wahsaga

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