Zur Navigation

Sprechende URL direkt aus Datenbank abrufen

1 Winelady

Hallo zusammen,
ich wende mich als Neuling hier im Forum mit einem .htaccess-Problem an Euch:

Ich habe in einem Verzeichnis eine Seite mit >250 Unterseiten, die dynamisch aus einer Datenbank generiert werden.

Die URLs lauten ../seite.php?id=[DB-ID]

DB-ID steht für eine maximal dreistellige Zahl, die in der DB als ID zur Abfrage des Inhalts der jeweiligen Seite genutzt wird.

Ich würde die URLs gern sprechend gestalten, ohne dabei alle Seiten in der .htaccess einzeln auflisten zu müssen. Ideal wäre, wenn die "schöne" URL direkt aus der DB abgerufen werden könnte?

Gibt es dafür eine Möglichkeit? Oder was wäre eine sinnvolle Alternative?

Danke für alle konstruktiven Hinweise!
LG Winelady

29.04.2022 11:06

2 Jörg

Ja, das ginge, indem in der Datenbanktabelle, in welcher die Seiten gespeichert sind, eine weitere "unique" Spalte eingerichtet wird, in der jeweils der sprechende Bestandteil der URL gespeichert wird. Die Datenbankabfrage in der PHP-Datei muss dann noch so angepasst werden, dass die Daten nicht mehr anhand der ID, sondern anhand der neuen Spalte selektiert werden. In der .htaccess Datei müssen die Seiten dazu noch auf die Datei seite.php umgeleitet werden, z.B.:

RewriteEngine on
RewriteRule ^verzeichnis/(.+)$ verzeichnis/seite.php?seite=$1

Danach kann in seite.php die Variable $_GET['seite'] für die Datenbankabfrage verwendet werden.

29.04.2022 11:28 | geändert: 29.04.2022 11:38

3 Winelady

Hallo Jörg,

danke für Deine superschnelle Antwort. Leider habe ich von der .htaccess praktisch keine Ahnung und komme noch nicht klar.

Hier ist mein aktueller Code:

Ausgansseite Link:
<a href="seite.php?id=2">Linktext</a>

Zielseite seite.php
$id= filter_var($_GET["id"], FILTER_SANITIZE_STRING); 

.htaccess
RewriteEngine On 
RewriteBase /verzeichnis/
RewriteRule ^/(.+)$ /seite.php?seite=$1

Ergebnis URL:
..seite.php?id=2
RewriteRule ^/(.+)$ /seite.php?seite=$1

Wie kommt jetzt der richtige URL-Text hinein und wie kriege ich die Variable aus der Anzeige raus?

Sorry, sind vermutlich Anfängerfragen…

LG Winelady

29.04.2022 14:03

4 Jörg

<a href="seite.php?id=2">Linktext</a>

Das Linkziel ersetzt du durch die sprechende URL, die in der Datenbanktabelle für den Datensatz id=2 gespeichert ist, z.B. "xyz":

<a href="xyz">Linktext</a>

Wenn der Link nicht manuell erstellt, sondern dynamisch generiert wird, muss der String aus der Datenbank abgefragt werden.

$id= filter_var($_GET["id"], FILTER_SANITIZE_STRING);

Analog für $seite:

$seite= filter_var($_GET["seite"], FILTER_SANITIZE_STRING);

Mit dieser Variablen werden dann die Datenbankabfragen durchgeführt.

RewriteEngine On 
RewriteBase /verzeichnis/
RewriteRule ^/(.+)$ /seite.php?seite=$1

Das schaut schon Ok aus.

Leider habe ich von der .htaccess praktisch keine Ahnung und komme noch nicht klar.

Die .htaccess bildet nur den Abschluss in der Umsetzung. Die wichtigsten Änderungen müssen in der PHP-Datei und in der Datebank vorgenommen werden. Als erstes muss in der Datenbanktabelle für die Seiten eine unique Spalte `seite` hinzugefügt werden, diese für alle über 250 Datensätze befüllt werden, und abschließend die Datenbankabfragen in der PHP-Datei so angepasst werden, dass nicht mehr nach der Spalte `id`, sondern nach der Spalte `seite` selektiert wird.

Wenn die URL https://example.com/verzeichnis/seite.php?seite=xyz den korrekten Inhalt anzeigt, dann sollte dies über den Eintrag in der .htaccess auch mit der URL https://example.com/verzeichnis/xyz funktionieren

29.04.2022 14:51 | geändert: 29.04.2022 14:54

5 Winelady

Hallo Jörg,
danke für diese überaus ausführliche Erklärung.

Ich habe jetzt das Linkziel mit dem Begriff aus der DB ersetzt und bekomme nun eine Fehlerseite-404 geliefert.

Ausgansseite:
<a href="xyz">Linktext</a>

Zielseite = seite.php
$seite= filter_var($_GET["seite"], FILTER_SANITIZE_STRING); 
 

.htaccess
RewriteEngine On 
RewriteBase /verzeichnis/
RewriteRule ^/(.+)$ /seite.php?seite=$1

Alternativ habe ich (try and error) den Link auf der Ausgangsseite in 4 Varianten ausprobiert – der Rest ist unverändert.

1.
<a href="seite.php?seite=xyz">Link1</a>
–> ..seite.php?seite=xyz = richtige Seite, aber URL falsch

2.
<a href="xyz?seite=xyz">Link2</a>
–> /xyz?seite=xyz = Fehlerseite404

3.
<a href="xyz.php?seite=xyz">Link3</a>
–> xyz.php?seite=xyz = Fehlerseite404

4.
<a href="seite.php?seite=xyz">Link4</a>
–> seite.php?seite=xyz = richtige Seite, aber URL falsch

Fehlt im Link noch etwas, oder steckt der Fehler in der .htaccess?
Ich bin leider am Ende meines Lateins.

LG Winelady

29.04.2022 15:51

6 Jörg

1.
<a href="seite.php?seite=xyz">Link1</a>
–> ..seite.php?seite=xyz = richtige Seite, aber URL falsch

Dann funktionieren die Datenbankabfragen schon mal korrekt.

In der .htaccess Datei würde ich nach dem ersten Slash im Muster noch ein ? anfügen:

RewriteRule ^/?(.+)$ /seite.php?seite=$1

Wo befindet sich seite.php - auch im Verzeichnis /verzeichnis/ ? in dem Fall würde ich den Slash davor weglassen:

RewriteRule ^/?(.+)$ seite.php?seite=$1

29.04.2022 16:28

7 Winelady

Oh je… erst mal vielen lieben Dank für Deine Mühe!

Wenn ich das ? einfüge zu
RewriteRule ^/?(.+)$ /seite.php?seite=$1
––> Fehlerseite-404.

? wieder raus und / raus:
RewriteRule ^/?(.+)$ seite.php?seite=$1
––> URL = /seite.php?seite=xyz
Parameter immer noch sichtbar

Alle Dateien einschließlich der .htaccess liegen im gleichen Verzeichnis.

29.04.2022 20:40

8 Jörg

Zitat von Winelady
RewriteRule ^/?(.+)$ seite.php?seite=$1
––> URL = /seite.php?seite=xyz
Parameter immer noch sichtbar

Was meinst du damit? wenn du die "sprechende URL" direkt im Browser eingibst (example.com durch deine Domain ersetzen):

https://example.com/verzeichnis/xyz

Wird die Seite korrekt angezeigt? wird die URLdabei weitergeleitet, so dass der Parameter wieder hintendran hängt? wenn ja, gibt es in der .htaccess Datei noch andere Direktiven, die dazwischenfunken könnten?

29.04.2022 22:03 | geändert: 29.04.2022 22:04

9 Winelady

Wenn ich im Browser ../verzeichnis/xyz eingebe, bekomme ich die Fehlerseite-404.

in der .htaccess gibt es keine weiteren Anweissungen.

30.04.2022 09:30

10 Winelady

Hallo Jörg,

inzwischen habe ich andere Weiterleitungen ausprobiert, z.B. um Doppelkontent mit /index.php zu eliminieren. Sie funktionieren alle einwandfrei. Auch Redirect permanent funktioniert.

Diverse Anleitungen aus dem Netz führen zu nichts; ich behalte immer die query-Parameter nach dem ? in der URL, selbst wenn ich den Mustercode buchstabengetreu übernehme.

Kann dahinter eventuell noch ein grundsätzlicher Fehler stecken?

Danke + ein schönes Wochenende!
LG Winelady

30.04.2022 10:52