Ein neues Tutorial aus der „Do it yourself“ Reihe, auf das ich gekommen bin, als ich mich wieder darüber aufregte, dass ich längere Links von Buchungsseiten zwecks Ferienplanung mit meinen Freunden per WhatsApp teilen wollte und diese so Ellenlang waren. Und natürlich findet man dann nicht auf die schnelle einen guten URL Shortener oder Shortlink Service. Bei den einen muss man sich zuerst registrieren, andere müllen einen mit Werbung voll, oder wollen Geld.
Dabei ist es eigentlich ganz einfach so was selber zu programmieren – Eine Webseite mit ein paar Zeilen PHP Code und eine MySQL Datenbank reicht schon aus.
Inhalt
Vorbereitungen
Zuerst wird eine Datenbank erstellt und am besten eine eigene Subdomain (z.B. lnk.example.com
) angelegt.
Funktionen erstellen
Nun werden vier PHP Dateien im Web-Verzeichnis erstellt: Ein, welche die Funktionen enthält, eine für den redirect eine für die Ein-/Ausgabe und eine für die Konfiguration.
Theoretisch könnte man auch alles ein einer Datei machen, aber die Aufteilung sorgt für etwas Übersicht.
config.php
Hier werden die Grundlegenden Angaben zur Datenbank und URLs in Variablen abgelegt:
<?php
$servername = 'localhost';
$username = 'shortuser';
$password = 'secret';
$dbname = 'shorturl';
if( isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] != "" )
$base_url='https://'.$_SERVER['HTTP_HOST'].'/';
else
$base_url='https://lnk.example.com/';
?>
Als URL nehmen wir mit $_SERVER['HTTP_HOST']
die von welcher die Seite gerade aufgerufen wird. Damit kann man später jede beliebige (Sub-) Domain auf die Seite zeigen lassen. Falls diese Server Variable nicht vorhanden ist, wird die Hauptdomain ausgegeben.
functions.php
Hier werden die Funktionen zum Ablegen der URLs und generieren der Shortlinks abgelegt:
<?php
function GetShortUrl($url) {
global $conn;
$query = "SELECT * FROM url_shorten WHERE url = '".$url."' ";
$result = $conn->query($query);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
return $row['short_code'];
} else {
$short_code = generateUniqueID();
$sql = "INSERT INTO url_shorten (url, short_code, hits)
VALUES ('".$url."', '".$short_code."', '0')";
if ($conn->query($sql) === TRUE) {
return $short_code;
} else {
die("Unknown Error Occured");
}
}
}
function generateUniqueID() {
global $conn;
$token = substr(md5(uniqid(rand(), true)),0,6); $query = "SELECT * FROM url_shorten WHERE short_code = '".$token."' ";
$result = $conn->query($query);
if ($result->num_rows > 0) {
generateUniqueID();
} else {
return $token;
}
}
function GetRedirectUrl($slug) {
global $conn;
$query = "SELECT * FROM url_shorten WHERE short_code = '".addslashes($slug)."' ";
$result = $conn->query($query);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$hits=$row['hits']+1;
$sql = "update url_shorten set hits='".$hits."' where id='".$row['id']."' ";
$conn->query($sql);
return $row['url'];
}
else
{
die("Invalid Link!");
}
}
?>
Die Funktion GetShortUrl()
legt die lange URL in der Datenbank ab, generateUniqueID()
geneirert eine eindeutige ID für die Kurz-URLs und GetRedirectUrl()
holt zu einer kurzen- die lange URL aus der Datenbank.
index.php
Hier werden die vorherigen Dateien inkludiert, zu den entsprechenden Adressen weitergeleitet und ein Formular angezeigt um neue Kurz-URLs zu erstellen:
<?php
include_once("config.php");
include_once("functions.php");
?>
<?php
if (isset($_GET['url']) && $_GET['url']!="")
{
$url=urldecode($_GET['url']);
if (filter_var($url, FILTER_VALIDATE_URL))
{
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$slug=GetShortUrl($url);
$conn->close();
echo $base_url.$slug;
}
else
{
die("$url is not a valid URL");
}
}
else
{
?>
<center>
<h1>Put Your Url Here</h1>
<form>
<p><input style="width:500px" type="url" name="url" required /></p>
<p><input type="submit" /></p>
</form>
</center>
<?php
}
if (isset($_GET['redirect']) && $_GET['redirect']!="")
{
$slug=urldecode($_GET['redirect']);
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$url= GetRedirectUrl($slug);
$conn->close();
header("location:".$url);
exit;
}
?>
Das Formular lässt sich sicher noch etwas schöner gestalten, etwa durch Verwendung des Bootstrap Framework.
Webserver einrichten
Nun wird in dem Verzeichnis noch eine .htaccess
Datei erstellt, damit man nicht das PHP Script aufrufen muss für die Weiterleitung:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?redirect=$1 [L]
</IfModule>
Damit ist der Dienst schon abgeschlossen und du kannst http://lnk.example.com/ aufrufen um für jede beliebige lange URL ein schöne kurze zu erstellen. 🙂
Wer noch etwas mehr funktionen und ein schönes Interface möchte (z.B. für die statistische Auswertung wie oft welcher Link aufgerufen wurde, kann auch die fertige YOURLS Applikation auf dem Webserver installieren. Das Grundprinzip bleibt jedoch das selbe.