Quer-Verweis

freundliche URLs

Suchmaschinen mögen URLs in der Form: http://xxx.yyy.zzz/website.php?id=/aaa.htm&bbb=123 nicht so gerne. Besser wäre die Darstellung: http://xxx.yyy.zzz/aaa.htm?bbb=123 ...

Voraussetzungen:

  • openEngine 1.6 im Verzeichnis /htdocs
  • Apache mit mod_rewrite

Ziel: Umwandlung der URLs beim Senden (Schritt 1) und Zurückwandlung beim Empfangen (Schritt 2)

Schritt 1: Umwandlung der URLs von http://xxx.yyy.zzz/website.php?id=/aaa.htm&bbb=123 nach http://xxx.yyy.zzz/aaa.htm?bbb=123

Um nicht in den vorhandenen Dateien der openEngine alle auftretenden URLs zu ändern, muss der jeweils zu sendende Text nach entsprechenden URLs abgesucht und entsprechend substituiert werden. Zentrale Datei ist die website.php; vor hier werden alle Module aufgerufen. Vorgehensweise: die Ausgabe wird zwischengepuffert, abgesucht und dann erst ausgeben. Dazu werden in der website.php folgende Eintragen vorgenommen:

zur Beginn der Datei - vor den ersten includes ...

ob_start('rewriteURL');
function rewriteURL($strBuffer) {
  if (!isAdmin()) {
   $strBuffer = preg_replace('#website.php\?id=(/.+)&(.+)(\'|")#U','\\1?\\2\\3',$strBuffer);
   $strBuffer = preg_replace('#website.php\?id=(/.+)(\'|")#U','\\1\\2',$strBuffer);
  }
  return $strBuffer;
  }

am Ende der Datei die folgenden Eintragung:

ob_end_flush();

Erläuterung:

ob_start(...) und ob_end_flush() erlauben es, auf den Ausgabe-Puffer von php zuzugreifen. In der Funktion ob_start wird eine Funktion angegeben, die am Ende der Füllung des Puffers aufgerufen wird. Die Funktion ist praktischerweise gerade darunter definiert. Wenn der Benutzer kein Admin ist (für den Fall, das ein Fehler entstanden ist, kann man als Admin nach der bisherigen Weise arbeiten) wird der $strBuffer (das ist der php-Puffer-Inhalt) mittels preg_replace 2x durchsucht. Einmal werden die URLs ersetzt, die einen zusätzlichen Parameter enthalten (&), beim zweiten Mal werden alle erstetzt ohne zusätzliche Parameter. Die genaue Erläuterung der reguläre Ausdrücke spare ich mir. Nur soviel: Eingerahmt werden die REs hier mit #-Zeichen; der Musterschalter U (ungreedy) dient dazu, möglichst kurze Muster-Stecken zu finden. Da manchmal das " und manchmal das ' das Ende einer URL bilden, wird dies entsprechend mit einem ODER-Ausdruck ('|") gebildet; da das ' im preg_replace der Begrenzer ist, muss das ' quotiert werden: (\'|").

Schritt 2: Umwandlung der URLs von http://xxx.yyy.zzz/aaa.htm?bbb=123 nach http://xxx.yyy.zzz/website.php?id=/aaa.htm&bbb=123

Erzeugen einer Datei namens .htaccess im /htdocs-Verzeichnis mit folgendem Inhalt:

RewriteEngine On
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /website.php?id=/$1 [QSA,NC]

Erläuterungen:

Zeile 1: Das RewriteEngine-Module des Apache wird für .htaccess-Kontext aktiviert.

Zeile 2: Es wird geprüft, ob die URL wenn sie nur einen Pfad ohne Datei enthält, auf ein Verzeichnis weist (-d), in dem eine Default-Apache-Datei (z.B. index.htm oder index.php) liegt. Wenn nein (!), dann wird in Zeile 3 aufgeführt, wenn ja, wird diese Default-Datei geladen.

Zeile 3: Es wird geprüft, ob die URL auf eine existierende Datei weist (-f). Wenn nein (!), dann wird Zeile 4 ausgeführt, ansonsten wird die Datei geladen.

Zeile 4: Wenn in der URL nach dem http://xxx.yyy.zzz etwas folgt, dass mindestend aus einem beliebigen Zeichen: .+ besteht - das soll auch schon alles sein, deshalb ^ und $ als Begrenzer - dann wird es gruppiert mit ( ). Also wenn so etwas in der URL vorkommt, dann wird es gegen den Text /website?id=/ ersetzt und die Gruppe () mit $1 hinten angehängt. NC sagt, dass Groß-/Kleinschreibung egal ist (nocase) und QSA meint, dass der Query-String (hier: bbb=123) noch angehängt wird.

© 2005 cptc | Impressum | powered by OpenEngine 1.6