URL Shortener – lange Links kürzen und Klicks verfolgen
Mit dem Dreamcodes URL Shortener kannst du lange, unhandliche Links in kurze, leicht teilbare URLs umwandeln. Jede generierte Kurz-URL ist eindeutig und leitet direkt auf die ursprünglich eingegebene Zielseite weiter. Das spart Platz, sieht professionell aus und erleichtert das Teilen von Links in sozialen Netzwerken, E-Mails oder Messengern.
Funktionsweise
Beim Erstellen eines Kurzlinks wird ein zufälliger, eindeutiger Code generiert, der die lange URL repräsentiert. Wenn jemand auf die Kurz-URL klickt, erfolgt eine automatische Weiterleitung zur ursprünglichen Seite. Gleichzeitig wird jeder Klick in der Datenbank gezählt, sodass du jederzeit nachvollziehen kannst, wie oft der Link genutzt wurde. Dies ermöglicht eine einfache Analyse der Reichweite deiner Links.
Vorteile
- Kurze Links: Erstelle kompakte URLs, die leichter zu merken und zu teilen sind
- Klick-Tracking: Jeder Zugriff wird gezählt, Statistiken geben Überblick über die Nutzung
- Einfache Bedienung: Keine Anmeldung notwendig, Links lassen sich direkt generieren
- Sicher und zuverlässig: Die Weiterleitung erfolgt über unseren geschützten Server, Links sind eindeutig und nur über den generierten Code erreichbar
Nutzungshinweise
- Gib die lange URL in das Eingabefeld ein und klicke auf „Shorten“.
- Kopiere die erzeugte Kurz-URL und teile sie mit deinen Kontakten.
- Jeder Klick auf den Kurzlink wird automatisch gezählt und kann über die Adminansicht oder bei Erweiterungen statistisch ausgewertet werden.
Hinweis
Bitte verwende den Dienst nur für Links, die du teilen darfst. Die Generierung der Kurzlinks erfolgt sofort, und die Weiterleitung ist permanent aktiv, solange die Datei auf dem Server existiert. Gelöschte Links können nicht wiederhergestellt werden.
<?php
// Configuration
define('DB_FILE', __DIR__ . '/url_shortener.sqlite');
define('BASE_URL', (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']==='on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
// Initialize DB
$db = new SQLite3(DB_FILE);
$db->exec("CREATE TABLE IF NOT EXISTS urls (
id INTEGER PRIMARY KEY,
short TEXT UNIQUE,
long TEXT,
created_at INTEGER,
clicks INTEGER DEFAULT 0
)");
function jsonResponse($data, $code = 200) {
http_response_code($code);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);
exit;
}
function generateShortCode($length = 6){
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$code = '';
for($i=0;$i<$length;$i++) $code .= $chars[random_int(0, strlen($chars)-1)];
return $code;
}
// API: shorten URL
if ($_SERVER['REQUEST_METHOD']==='POST' && isset($_GET['action']) && $_GET['action']==='shorten'){
$longUrl = trim($_POST['url'] ?? '');
if (!$longUrl || !filter_var($longUrl, FILTER_VALIDATE_URL)){
jsonResponse(['error'=>'Ungültige URL'],400);
}
$short = generateShortCode();
$stmt = $db->prepare('INSERT INTO urls (short,long,created_at) VALUES (:short,:long,:created_at)');
$stmt->bindValue(':short',$short,SQLITE3_TEXT);
$stmt->bindValue(':long',$longUrl,SQLITE3_TEXT);
$stmt->bindValue(':created_at',time(),SQLITE3_INTEGER);
$stmt->execute();
jsonResponse(['shortUrl'=>BASE_URL.'?r='.$short,'longUrl'=>$longUrl]);
}
// Redirect handler
if (isset($_GET['r'])){
$code = preg_replace('/[^a-zA-Z0-9]/','',$_GET['r']);
$stmt = $db->prepare('SELECT * FROM urls WHERE short=:short LIMIT 1');
$stmt->bindValue(':short',$code,SQLITE3_TEXT);
$row = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if (!$row){ http_response_code(404); echo 'Link nicht gefunden'; exit; }
// Increment clicks
$upd = $db->prepare('UPDATE urls SET clicks=clicks+1 WHERE id=:id');
$upd->bindValue(':id',$row['id'],SQLITE3_INTEGER);
$upd->execute();
header('Location: '.$row['long']);
exit;
}
// Serve UI
?>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Dreamcodes - URL Shortener</title>
<style>
:root{--bg:#0f1724;--card:#0b1220;--accent:#7c3aed;--muted:#9aa4b2;--glass: rgba(255,255,255,0.03);}
body{font-family:Inter, sans-serif;background:linear-gradient(180deg,var(--bg),#071028);color:#e6eef8;margin:0;padding:40px;}
.container{max-width:900px;margin:0 auto}
.card{background:linear-gradient(180deg,var(--card),#071022); padding:28px;border-radius:16px;box-shadow:0 10px 30px rgba(2,6,23,0.7);}
h1{font-size:24px;margin:0 0 8px}
p.lead{color:var(--muted);margin:0 0 20px}
.inputtext{background:transparent;border:1px solid rgba(255,255,255,0.04);padding:8px 10px;border-radius:8px;color:inherit;width:100%}
.btn{background:var(--accent);color:white;padding:10px 14px;border-radius:10px;border:none;cursor:pointer;font-weight:600}
.result{margin-top:16px;padding:12px;background:rgba(255,255,255,0.02);border-radius:10px}
.linkbox{display:flex;justify-content:space-between;gap:12px;align-items:center}
footer{margin-top:18px;text-align:center;color:var(--muted);font-size:13px}
.thin{opacity:0.8}
</style>
</head>
<body>
<div class="container">
<div class="card">
<h1>URL Shortener</h1>
<p class="lead">Wandle lange URLs in kurze Links um, teile sie einfach und tracke die Klicks.</p>
<input id="longUrl" class="inputtext" type="url" placeholder="Gib hier die lange URL ein">
<button id="shortenBtn" class="btn">Shorten</button>
<div id="result" class="result" style="display:none">
<div class="linkbox">
<input id="shortLink" class="inputtext" readonly>
<button id="copyBtn" class="btn">Kopieren</button>
</div>
</div>
<div id="error" class="thin" style="color:#ffb4b4;margin-top:10px"></div>
</div>
<footer><div class="thin">Powered by Dreamcodes.NET</div></footer>
</div>
<script>
(async()=>{
const shortenBtn = document.getElementById('shortenBtn');
const longUrl = document.getElementById('longUrl');
const result = document.getElementById('result');
const shortLink = document.getElementById('shortLink');
const copyBtn = document.getElementById('copyBtn');
const error = document.getElementById('error');
shortenBtn.addEventListener('click', async ()=>{
error.textContent='';
result.style.display='none';
if (!longUrl.value) { error.textContent='Bitte URL eingeben'; return; }
try{
const fd = new FormData();
fd.append('url', longUrl.value);
const resp = await fetch(location.pathname+'?action=shorten',{method:'POST',body:fd});
const data = await resp.json();
if (!resp.ok){ error.textContent = data.error || 'Fehler beim Shorten'; return; }
result.style.display='block';
shortLink.value = data.shortUrl;
}catch(e){error.textContent='Netzwerkfehler'}
});
copyBtn.addEventListener('click',async()=>{
try{await navigator.clipboard.writeText(shortLink.value); copyBtn.textContent='Kopiert'; setTimeout(()=>copyBtn.textContent='Kopieren',2000);}catch(e){error.textContent='Kopieren nicht moeglich'}
});
})();
</script>
</body>
</html>