URL-Rewriting

1. Einleitung

Das Adventure PHP Framework unterstützt das transparente Umschreiben von URLs (auch bekannt als URL-Rewriting) auf Basis von Eingabe-Filtern und der Link-Generierung. Sie können damit eine Änderung des URL-Layout ohne Anpassung der Applikation durchführen.

Mit dem APF ausgeliefert wird ein Standard-Set bestehend aus Eingabe- und Ausgabe-Filtern (ChainedUrlRewritingInputFilter und ChainedUrlRewritingOutputFilter) und Link-Generierung (RewriteLinkScheme), mit der ein generisches, umgeschriebenes URL-Format in Ihrer Applikation genutzt werden kann.

Weitere URL-Formate lassen sich darauf basierend sehr einfach umsetzen. Ein Tutorial hierzu finden Sie im Wiki.

2. URL-Layout

Die mitgelieferten Komponenten ermöglichen das Umschreiben einer URL der Form

Code
http://www.example.com/?page=start

in

Code
http://www.example.com/page/start

Wie dem zweiten Code-Block entnommen werden kann, wurden ? und = durch jeweils einen / ersetzt um den Eindruck einer Ordner-Struktur zu erwecken. Beim Aufruf der Seite wird der Parameter page jedoch wie im ersten Block mit dem Wert start gefüllt.

Die Anzahl der Parameter ist dabei nicht begrenzt. Das URL-Schema lautet wie folgt:

Code
{scheme}://{host}/{param1}/{value1}/{param2}/{value2}/...

Parameter und Werte sind jeweils mit einem / getrennt, mehrere Paare ebenfalls per /. Für URLs mit Action-Anweisungen gilt ein erweitertes Schema das Sie im Kapitel Front-Controller nachlesen können.

Beim Einsatz von umgeschriebenen URLs mit den Boardmitteln des APF muss beachtet werden, dass die Bootstrap-Datei (z.B. index.php) im DOCUMENT_ROOT des Webservers oder VHOSTs liegt. Dies ist notwendig um die Zuordnung der Parameter zu ihren Werten korrekt auszuführen.

3. Konfiguration

Die Konfiguration des URL-Mappings des APF beinhaltet mehrere Komponenten:

Komponente Beschreibung
Eingabe-Filter Der Eingabe-Filter sorgt für die Auflösung des URL-Schema. Hierzu wird die URL in ihre Bestandteile zerlegt und zur Weiterverarbeitung gespeichert. Dies erfolgt typischerweise im $_REQUEST-, $_GET- bzw. $_POST-Array damit die nachfolgend ausgeführte Applikation unabhängig von der Aussen-Repräsentation ist. Details lassen sich im Kapitel Filter nachlesen.
Link-Schema Die genutzte Implementierung des LinkScheme-Interfaces kümmert sich um die Generierung von URLs nach dem gewünschten Schema. Sie erzeugt im Gegensatz zum Eingabe-Filter aus einer internen Repräsentation der URL eine externe Darstellung. Details zur Generierung von URLs können Sie im Kapitel Links nachlesen.
Ausgabe-Filter Sofern notwendig, lassen sich anderweitig generierte URLs mit Hilfe eines Ausgabe-Filters auch auf das gewünschte externe Format umschreiben. In einem Ausgabe-Filter haben Sie Zugriff auf den kompletten Quelltext und damit lassen sich beispielsweise Formular-Actions, Bild-URLs oder andere Ressourcen nachträglich umschreiben und an die gewünschte externe Repräsentation anpassen.
Webserver-Konfiguration Um das Umschreiben von URLs und gleichzeitig die Auslieferung einer Seite über eine Bootstrap-Datei zu erreichen ist eine Konfiguration Ihres Webserves bzw. Ihres virtuellen Servers notwendig. Ohne entsprechende Regeln prüft der Webserver ob das angefragte Verzeichnis existiert und läuft logischerweise auf einen Fehler.

Die folgenden Kapitel beschreiben die Konfiguration der oben genannten Komponenten für einfache und umgeschriebene URLs.

3.1. Standard-URLs

Im Auslieferungszustand definiert das APF einen Standard-Eingabe-Filter (ChainedStandardInputFilter), der sich um die Extraktion der Front-Controller-Anweisungen kümmert. Ferner wird das DefaultLinkScheme registriert, das die Generierung von einfachen URLs mit Action-Anweisungen beherrscht.

Der Umgang mit einfachen URLs erfordert keine Ausgabe-Filter oder Webserver-Regeln. Aus diesem Grund befindet sich in der Datei APF/core/bootstrap.php keine weitere Konfiguration.

Sofern Sie in Ihrem Projekt mit einfachen URLs arbeiten möchten, sind daher keine Änderung zum Standard-Setup notwendig.

3.2. Umgeschriebene URLs

Beabsichtigen Sie umgeschriebene URLs einzusetzen, ist eine Anpassung des Auslieferungszustandes notwendig. Dies kann zentral in der Bootstrap-Datei Ihrer Applikation (zumeist index.php) nach dem Einbinden der zentralen Bootstrap-Datei des APF (APF/core/bootstrap.php) erfolgen.

Für den Einsatz von URL-Rewriting wird die Nutzung einer zentralen Bootstrap-Datei empfohlen, da Konfigurations-Einstellungen zentral vorgenommen werden können und sich die Konfiguration des Webservers einfacher gestaltet.

Die folgenden Kapitel zeigen die notwendigen Schritte zur Konfiguration der mitgelieferten Implementierung für umgeschriebene URLs.

3.2.1. Eingabe-Filter

Wie in Kapitel 3 angesprochen kümmern sich Eingabe-Filter um die Entgegennahme und Interpretation der Anfrage. Um das im Kapitel 2 beschriebene URL-Schema aufzulösen und in die interne Repräsentation umzuschreiben wird der ChainedUrlRewritingInputFilter benötigt.

Registrieren Sie diesen in der Bootstrap-Datei Ihrer Applikation wie folgt:

PHP-Code
include('../APF/core/bootstrap.php'); use APF\core\filter\InputFilterChain; use APF\core\filter\ChainedUrlRewritingInputFilter; InputFilterChain::getInstance()->clear()->prependFilter(new ChainedUrlRewritingInputFilter());

Als zweiter Schritt ist die Anpassung der LinkScheme-Implementierung notwendig. Diese generiert an Hand des in Kapitel 2 beschriebene URL-Schema eine externe URL-Repräsentation.

Die Registrierung des zum ChainedUrlRewritingInputFilter passenden Link-Schema lässt sich wie folgt im Anschluss an die Registrierung des Eingabe-Filters erledigen:

PHP-Code
use APF\tools\link\RewriteLinkScheme; use APF\tools\link\LinkGenerator; LinkGenerator::setLinkScheme(new RewriteLinkScheme());
3.2.3. Webserver-Konfiguration

Um die Anfrage an die virtuellen Ordner-Struktur (URL-Schema siehe Kapitel 2) an die Bootstrap-Datei Ihrer Applikation weiterzuleiten ist eine Anpassung der Webserver- oder VirtualHost-Konfiguration notwendig.

Mit der folgenden RewriteRule (Apache Webserver) können Sie die notwendige Konfiguration in der .htaccess vornehmen:

Code
RewriteEngine on RewriteRule !index\.php$ /index.php?apf-rewritten-query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]

Die erste Zeile aktiviert das Modul mod_rewrite des Apache-Webservers, das in der Lage ist URLs intern umzuschreiben und Anfragen auf unterschiedliche Ressourcen umzuleiten, Zeile 2 sorgt dafür, dass alle Anfragen an die index.php umgeleitet werden.

Dabei ist zu beachten, dass der Teil

Code
/index.php?apf-rewritten-query=%{REQUEST_URI}&%{QUERY_STRING}

der Regel bindend ist, da der ChainedUrlRewritingInputFilter in der Lage ist, das URL-Schema aufzulösen.

Mit dem Teil

Code
!index\.php$

stellen Sie sicher, dass keine Umleitungsschleife entsteht.

Bilder, CSS- und Java-Script-Dateien werden üblicherweise statisch ausgeliefert, sprich direkt vom Webserver und nicht über die index.php. Um dies sicher zu stellen, fügen Sie bitte entsprechende Ausschluss-Kriterien zur oben genannten Regel hinzu. Dies kann entweder durch Erweiterung der RewriteRule oder entsprechenden RewriteCond-Definitionen erfolgen. Beispiel:

Code
# Ausschluss definierter Verzeichnisse RewriteCond %{REQUEST_URI} !^(\/images|\/css|\/js) [NC] # Ausschluss von definierten Dateien bzw. Endungen RewriteRule !(index\.php|\.css|\.jpe?g|\.png|\.gif|\.ico)$ /index.php?apf-rewritten-query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]

Beide Vorgehensweisen lassen sich kombinieren. Details entnehmen Sie bitte der Dokumentation Ihres Webservers.

3.2.4. Ausgabe-Filter

Um auch anderweitig generierte URLs auf das in Kapitel 2 beschriebene URL-Schema umzuschreiben können Sie den ChainedUrlRewritingOutputFilter einsetzen. Dieser schreibt alle URLs in a- und form-Tags um.

Möchten Sie z.B. externe URLs vom Umschreiben ausnehmen, so können Sie dazu das HTML-Attribut linkrewrite auf den Wert false setzen. Der Filter nutzt diese Information um die damit gekennzeichnete URL auszunehmen, entfernt die Kennzeichnung jedoch wieder um den Quelltext nicht zu beeinflussen.

Die Konfiguration des Ausgabe-Filters können Sie wie folgt in der Bootstrap-Datei konfigurieren:

PHP-Code
use APF\core\filter\OutputFilterChain; use APF\core\filter\ChainedUrlRewritingOutputFilter; OutputFilterChain::getInstance()->appendFilter(new ChainedUrlRewritingOutputFilter());

Bitte beachten Sie, dass auch diese Konfiguration nach der Einbindung der APF/core/bootstrap.php erfolgen muss.

mailto:-Links werden automatisch von der Umschreibung ausgenommen.

4. Hinweise

Beim Einsatz von URL-Rewriting sollte folgendes beachtet werden:

  • Ressourcen wie Bilder, CSS-Dateien oder Java-Scripte müssen absolut addressiert werden.
  • Komponenten die URLs manuell generieren müssen angepasst werden. Es empfiehlt sich, diese direkt auf die Generierung von URLs mit dem LinkGenerator umzustellen. Details hierzu können Sie unter Links nachlesen.
  • Werden mehrere Bootstrap-Dateien verwendet, müssen diese in der Ausnahmeliste der Webserver-Konfiguration aufgenommen werden.

Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
Für diesen Artikel liegen aktuell keine Kommentare vor.