mod_rewrite Konzept SEF
Schorsch
- programmiertechnik
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.
Ist das der Richtige Ansatz?
Geht das nicht mit weniger DB-Abfragen?
Wie macht das Joomla (SEF-Komponente)?
Gruss
Schorsch
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";
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
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";
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
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