joerghuelsermann.de Kurz Url

Kurz Url

Zu einem eigenen Kurz Url Dienst auch bezeichnet als Shortener Url kann man durch ein einfaches PHP Skript kommen. Dann noch einige Zeilen in die htaccess eingetragen dann läuft der eigene Dienst um seine URL zu verkürzen. In diesem Beispiel verwende ich eine XML Datenbank.

Dieser vorgestellte Shortener Url befindet sich auf Freihandelswelt in einer modifizierten Version im Einsatz.

Aufbau der XML Datenbank für den Kurz Url Dienst

Selbstverständlich kann man auch jedes andere Datenbankformat verwenden. Eine XML Datenbank hat halt eben den Vorteil das diese sehr sicher ist und man sie auch ohne verfügbare MySql Datenbank anwenden kann.

In unserem Beispiel besteht jeder Datensatz in der XML Datei aus einer fortlaufenden Nummer und der entsprechenden URL als Datenfelder. Die Pflege dieser XML Datenbank kann im Grunde mit einem einfachen Texteditor bereits durchgeführt werden.

Beispiel für den Aufbau einer XML Datenbank für den Kurz Url Dienst
<?xml version="1.0" encoding="UTF-8"?>
<dienst>
<shorturl><nummer>1</nummer><url>http://prskspedia.de/</url></shorturl>
<shorturl><nummer>2</nummer><url>http://nevada-fields.de/</url></shorturl>
<shorturl><nummer>3</nummer><url>http://freihandelswelt.de/</url></shorturl>
<shorturl><nummer>4</nummer><url>http://3jh.de/</url></shorturl>
</dienst>

PHP Code für die Kurz Url

Das Skript übernimmt die Eingabe des Pfades durch die Get Methode. Die XML Datei wird ausgelesen und durchlaufen. Wenn die Eingabe als Datensatz vorhanden ist wird die betreffende URL übergeben.

Danach findet noch eine Überprüfung statt, ob diese Adresse übergeben worden ist. Falls dieses der Fall ist wird zur entsprechenden Adresse eine Weiterleitung vorgenommen. In allen anderen Fällen wird eine Weiterleitung an eine Ausweichadresse vorgenommen. An dieser Stelle könnte man natürlich anstelle des angegebenen Statuscode auch andere verwenden um eine Fehlermeldung des Server zu senden.

PHP Skript für den Kurz Url Dienst
$url = '';
$nummer = $_GET['id'];
$xml = simplexml_load_file('../db/url.xml');
foreach ($xml->shorturl as $data) {
if ($nummer == $data->nummer) {
$url = $data->url;
break;}
}
if ($url != '') {
header('Status: 301');
header('Location: '.$url);}
else {
header('Status: 301');
header('Location: http://joerghuelsermann.de/');}

Alternative Ausgabe einer Fehlerseite

Anstatt der Ausgabe einer Ausweichadresse bieten sich folgende Möglichkeiten an.

header('Status: 410');
echo 'Diese Seite ist nicht mehr vorhanden im Kurz Url Dienst';
header('Status: 404');
echo 'Diese Seite existiert nicht im Kurz Url Dienst';

Hypertext access des Kurz Url Dienst

In diesem Falle ist in dem Verzeichnis x die PHP Datei abgelegt mit dem der Dienst auf einem Apache Server arbeitet.

Durch die Bedingungen werden alle Aufrufe des Kurz Url Dienstes in unserem Verzeichnis mit Angabe des Pfades an die entsprechende Datei weitergeleitet.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/x/
RewriteRule ^(.*)x/(.+)$ $1x/index.php?id=$2 [QSA]

Als bessere Variante habe ich später dann die Umleitung mit Hilfe von regulären Ausdrücken angesprochen.

RewriteEngine on
RewriteRule ^x/([0-9]+)$ /x/index.php?id=$1 [QSA]

Man kann alternativ auch in dem entsprechenden Verzeichnis eine htaccess Datei anlegen.

RewriteEngine on
RewriteRule ^([^/]*)$ index.php?id=$1 [QSA]

Erweiterbarkeit des Kurz Url Dienstes

Dieses vorgestellte Prinzip um einen eigenen Shortener Url aufzubauen ist erweiterbar um viele Punkte durch Modifizierungen des PHP Skriptes.

Text Datei als Datenbankformat

Eine Alternative wäre als Datenquelle auch eine Text Datei zu verwenden in welcher man die gewünschte Kurz Url von der Webseite, die durch die Umleitung erreicht werden soll durch ein Leerzeichen trennt.

Beispiel für den Aufbau einer Text Datei als Datenbank für den Kurz Url Dienst
pp http://prskspedia.de/
nf http://nevada-fields.de/
wi http://freihandelswelt.de/
3jh http://3jh.de/

Nun wird einfach nur noch mit regulären Ausdrücken die Text Datei durchsucht und die erste Übereinstimmung angewendet. Dieses Prinzip könnte man auch mit leichten Variationen auf die XML Datenbank anwenden.

Text Datei mit PHP durchsuchen
$url = file_get_contents('umleitung.txt');
preg_match('#^'.$_GET['id'].'\s+([^\s]*)#m',$url,$umleitung);
if (isset($umleitung[1])) {
header('Location:http://'.$umleitung[1],true,301);
exit;}
header('Status: 404');
echo 'Diese Seite existiert nicht im Kurz Url Dienst';

Umleitung durch Datenreihen mit Zufallsfunktion

Man ist auch in der Lage eine zufällige Umleitung aufzubauen. Im folgenden Beispiel verwende ich eine einfache Datenreihe. Im Prinzip kann man jede Datenbank in eine Datenreihe überführen und dort den Faktor Zufall darauf anwenden. Da es sich in diesem Fall nicht um eine permanente Umleitung handelt sollte man einen anderen Status Kode verwenden.

Zufällige Umleitung durch PHP
$zufall = array('http://3jh.de/','http://freihandelswelt.de/','http://joerghuelsermann.de/','http://nevada-fields.de/','http://prskspedia.de/');
shuffle($zufall);
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 30 Aug 2011 15:00:00 GMT');
header('Location: '.$zufall[0],true,307);
exit;

Mysql als Datenbankformat

Bei der Entwicklung von meinem privaten Kurz Url Dienst 3JH habe ich dann MySql als Datenbank verwendet.

Angaben in der Hypertext access

Durch die folgenden Angaben wird durch die htaccess Datei erreicht, das falls keine Datei oder Verzeichnis mit gleichem Namen im Hauptverzeichnis existiert die ersten Bedingungen erfüllt sind das der Umleitungsdienst angesprochen wird. Danach findet noch eine Prüfung der letzten Bedingung statt mit einem regulärem Ausdruck, ob die angeforderte Kurz Url zwischen 1 und 8 Zeichen besitzt, wobei an Zeichen nur Buchstaben, Ziffern und der Unterstrich zugelassen sind.

Inhalt der htaccess Datei für den Kurz Url Dienst im Hauptverzeichnis
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\w{1,8})$ /umleitung.php?id=$1 [QSA]

Aufbau der MySql Datenbank

An dieser Stelle folgt nun die Strukutr der verwendeten Datenbank die in der Praxis noch erweitert wurde um zusätzliche Funktionen sicher zu stellen. Die Datenbank muss man nun nur noch mit den entsprechenden Daten füllen.

Struktur der MySql Datenbank
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
CREATE TABLE IF NOT EXISTS `dienst` (
`kurzurl` char(8) COLLATE utf8_unicode_ci NOT NULL,
`umleitung` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`kurzurl`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Abfrage der MySql Datenbank durch PHP

Durch den Einsatz von PHP wird die MySql Datenbank nun entsprechend abgefragt. Zuerst findet eine Überprüfung des übergebenden Parameter an den Kurz Url Dienst statt. Danach wird eine Suche in der Datenbank durchgeführt und falls ein Datensatz vorliegt wird auf die entsprechende URL umgeleitet.

PHP Skript für die Umleitung durch die MySql Datenbank
if (isset($_GET['id']) AND preg_match ('#^\w{1,8}$#',$_GET['id'])) {
$verbindung = mysqli_connect ('server','benutzer','passwort','datenbank');
mysqli_set_charset($verbindung,'utf8');
$suche = mysqli_real_escape_string($verbindung,$_GET['id']);
$abfrage = 'SELECT umleitung FROM dienst WHERE kurzurl = "'.$suche.'";';
$ergebnis = mysqli_query($verbindung,$abfrage);
mysqli_close($verbindung);
if(mysqli_num_rows($ergebnis) != 0) {
while($row = mysqli_fetch_object($ergebnis)) {
header('Location: '.$row->umleitung,true,301);exit;}
}
}
header('Status: 404');
echo 'Diese Seite existiert nicht im Kurz Url Dienst';

Per Hypertext access umleiten

In meinem privaten Kurz Url Dienst habe ich eine Seite zu den hexadezimalen Farbwerten mal angelegt, die 50 zufällig generierte Links mit den hexadezimalen Farbwerten aus dem RGB Farbraum erzeugt. Diese Farben werden dann über eine Zeile in der htaccess Datei dann wieder umgeleitet. Durch den Einsatz von regulären Ausdrücken erzeugt diese eine Zeile 16777216 Umleitungen zu der betreffenden Farbe. Ich denke dieses Beispiel beweist eindeutig das nicht in jedem Falle der Einsatz einer Datenbank unbedingt Sinn für einen Kurz Url Dienst macht.

htaccess für die Umleitung der hexadezimalen Farbwerte.
RewriteRule ^rgb([a-f0-9]{6})$ http://joerghuelsermann\.de/farbe/$1 [R=301,L]