Zum Inhalt springen
PHP

Sprechende URLs

Lesbare URLs sind nicht nur schöner anzusehen, sie helfen auch Besucher und auch Suchmaschinen schon vor dem Aufruf eines Links zu erkennen, was sich hinter dem Link verbirgt.

🔔 Information
Diese Technik war in der Zeit vor modernen PHP-Frameworks und CMS-Systemen weit verbreitet. Heute ist sie in den meisten Projekten nicht mehr notwendig: Suchmaschinen haben gelernt, auch URLs mit GET-Parametern korrekt zu interpretieren. Außerdem bringen Frameworks wie Laravel, Symfony oder Shopware – und CMS-Systeme wie WordPress – ein eigenes Routing mit, das saubere URLs ohne manuelle .htaccess-Konfiguration liefert. Wer noch ein Legacy-Projekt ohne Framework betreibt, für den ist die folgende Anleitung aber nach wie vor relevant.

Wer mit PHP eine einfache Website oder ein kleines CMS ohne Framework baut, landet schnell bei URLs wie dieser:

http://example.com/index.php?page=kontakt

Das funktioniert technisch einwandfrei. Für Suchmaschinen und Besucher ist es aber alles andere als ideal. Deutlich besser – und damals wie heute lesbarer – ist eine URL in dieser Form:

http://example.com/kontakt/

Die Seite existiert dabei nicht wirklich als Ordner auf dem Server. Apache wird per mod_rewrite angewiesen, die Anfrage intern umzuschreiben, bevor PHP sie verarbeitet. Der Besucher und die Suchmaschine sehen die saubere URL, PHP bekommt intern trotzdem den GET-Parameter.


Warum saubere URLs damals so wichtig waren

Um 2008–2015 waren Suchmaschinen beim Crawlen von URLs mit vielen GET-Parametern deutlich zurückhaltender als heute. Google empfahl ausdrücklich, auf sogenannte SEF URLs (Search Engine Friendly URLs) zu setzen, weil:

  • URLs mit sprechenden Pfaden besser in den Suchergebnissen angezeigt wurden
  • Nutzer auf saubere Links eher klicken („Wo führt mich dieser Link hin?“)
  • Crawler parameterlastige URLs teilweise gar nicht erst verfolgten
  • Backlinks auf lesbare URLs natürlicher wirkten

Voraussetzung: mod_rewrite aktiviert

Damit das alles funktioniert, muss mod_rewrite im Apache aktiviert sein. Wie das geht, haben wir in unserem Tutorial zu mod_rewrite beschrieben.


Schritt 1: Die .htaccess-Datei

Im Webroot-Verzeichnis (also da, wo auch eure index.php liegt) legt ihr eine Datei namens .htaccess an – oder öffnet eine bestehende. Fügt folgende Regeln ein:

RewriteEngine On

# Echte Dateien und Ordner ausschließen
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Alles andere an index.php weiterleiten
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?page=$1 [L,QSA]

Was passiert hier?

  • RewriteEngine On – aktiviert die Rewrite-Engine für dieses Verzeichnis
  • Die beiden RewriteCond-Zeilen stellen sicher, dass echte Dateien (z. B. Bilder, CSS) und echte Ordner nicht umgeschrieben werden
  • Die RewriteRule fängt Pfade wie /kontakt/ ab und leitet sie intern an index.php?page=kontakt weiter
  • [L] bedeutet: diese Regel ist die letzte, danach wird nicht weiter gesucht
  • [QSA] (Query String Append) sorgt dafür, dass bereits vorhandene GET-Parameter erhalten bleiben

Schritt 2: Die index.php anpassen

PHP empfängt nun den Parameter page wie gewohnt über $_GET. Ein einfaches Routing könnte so aussehen:

<?php

$page = isset($_GET['page']) ? $_GET['page'] : 'home';

// Nur erlaubte Seitennamen zulassen (Sicherheit!)
$allowed = ['home', 'kontakt', 'ueber-uns', 'leistungen'];

if (!in_array($page, $allowed)) {
    header('HTTP/1.0 404 Not Found');
    include 'seiten/404.php';
    exit;
}

include 'seiten/' . $page . '.php';
?>

Wichtig: Niemals den GET-Parameter ungeprüft als Dateinamen verwenden. Das obige Beispiel mit einer Whitelist ($allowed) ist das Minimum an Absicherung.


Damit auch die Links auf der Seite selbst die neue URL-Struktur verwenden, müssen alle internen Verlinkungen angepasst werden. Statt:

<a href="index.php?page=kontakt">Kontakt</a>

schreibt ihr:

<a href="/kontakt/">Kontakt</a>

Das ist nicht nur für Suchmaschinen besser, sondern auch für Nutzer, die die URL in der Adressleiste lesen.


Mehrstufige Pfade

Wer tiefere URL-Strukturen wie /blog/artikel-titel/ braucht, passt die RewriteRule entsprechend an:

RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?section=$1&slug=$2 [L,QSA]

PHP empfängt dann $_GET['section'] und $_GET['slug'] getrennt und kann entsprechend reagieren.


Fazit

Mit wenigen Zeilen in der .htaccess und einem kleinen Routing-Block in der index.php ließen sich auch einfache PHP-Projekte ohne Framework mit sauberen, suchmaschinenfreundlichen URLs ausstatten. Die Technik war damals ein wichtiger Baustein für jede ernstzunehmende Website.

Heute übernehmen das Frameworks und CMS automatisch – das Grundprinzip dahinter ist aber unverändert: mod_rewrite schreibt die URL um, bevor PHP sie sieht. Wer versteht, was dabei passiert, versteht auch, warum Laravel-Routen oder WordPress-Permalinks so funktionieren wie sie es tun.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Markdown erlaubt · keine Anmeldung nötig