Shortlink Service selber machen

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. 🙂

Beispiel mit etwas Styling

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.

Referenzen

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

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