Własny skracacz linków (bez bazy danych)
- WWW i API
- poziom: średni
- aktualizacja: 12 lipca 2026
Własny skracacz linków w Twojej domenie wygląda profesjonalnie i daje pełną kontrolę — żadna zewnętrzna firma nie śledzi Twoich odbiorców i nie „umrze" razem z Twoimi linkami. Ten skrypt mieści się w jednym pliku, dane trzyma w JSON-ie, a przy okazji zlicza kliknięcia.
<?php
/**
* Własny skracacz linków — skryptyPHP.com
* Zapisz jako: s.php
*
* Użycie:
* s.php — formularz skracania
* s.php?k=Ab3xYz — przekierowanie pod zapisany adres
*
* Ładniejsze adresy (https://twojadomena.pl/s/Ab3xYz) da reguła w .htaccess:
* RewriteRule ^s/([a-zA-Z0-9]+)/?$ s.php?k=$1 [L]
*/
// ── USTAWIENIA ──────────────────────────────────────────────
$plik_danych = __DIR__ . '/linki.json';
$dlugosc_kodu = 6;
// ── FUNKCJE ─────────────────────────────────────────────────
function wczytaj_linki(string $plik): array
{
if (!is_file($plik)) {
return [];
}
$dane = json_decode((string) file_get_contents($plik), true);
return is_array($dane) ? $dane : [];
}
function zapisz_linki(string $plik, array $linki): void
{
file_put_contents(
$plik,
json_encode($linki, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES),
LOCK_EX
);
}
function generuj_kod(int $dlugosc, array $zajete): string
{
$znaki = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
do {
$kod = '';
for ($i = 0; $i < $dlugosc; $i++) {
$kod .= $znaki[random_int(0, strlen($znaki) - 1)];
}
} while (isset($zajete[$kod])); // w razie kolizji losuj ponownie
return $kod;
}
// ── PRZEKIEROWANIE: s.php?k=KOD ─────────────────────────────
if (isset($_GET['k'])) {
$kod = preg_replace('~[^a-zA-Z0-9]~', '', $_GET['k']);
$linki = wczytaj_linki($plik_danych);
if ($kod !== '' && isset($linki[$kod])) {
// Zliczamy kliknięcie
$linki[$kod]['klikniecia']++;
zapisz_linki($plik_danych, $linki);
header('Location: ' . $linki[$kod]['adres'], true, 301);
exit;
}
http_response_code(404);
exit('Nie znaleziono takiego linku.');
}
// ── SKRACANIE: formularz ────────────────────────────────────
$nowy_link = '';
$blad = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$adres = trim($_POST['adres'] ?? '');
$poprawny = filter_var($adres, FILTER_VALIDATE_URL) !== false
&& preg_match('~^https?://~i', $adres) === 1;
if (!$poprawny) {
$blad = 'Podaj pełny adres zaczynający się od http:// lub https://';
} else {
$linki = wczytaj_linki($plik_danych);
$kod = generuj_kod($dlugosc_kodu, $linki);
$linki[$kod] = [
'adres' => $adres,
'klikniecia' => 0,
'utworzono' => date('Y-m-d H:i:s'),
];
zapisz_linki($plik_danych, $linki);
// Pełny adres skróconego linku
$baza = (isset($_SERVER['HTTPS']) ? 'https' : 'http')
. '://' . $_SERVER['HTTP_HOST']
. strtok($_SERVER['REQUEST_URI'], '?');
$nowy_link = $baza . '?k=' . $kod;
}
}
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Skracacz linków</title>
<style>
body { font-family: sans-serif; max-width: 560px; margin: 20px auto; }
input[type=url] { width: 70%; padding: 8px; }
button { padding: 8px 18px; }
.wynik { background: #eef7ee; padding: 12px; margin-top: 16px; border-radius: 6px; }
.blad { color: #b00020; }
</style>
</head>
<body>
<h1>Skróć link</h1>
<form method="post" action="">
<input type="url" name="adres" placeholder="https://bardzo-dlugi-adres.pl/..."
required>
<button type="submit">Skróć</button>
</form>
<?php if ($blad): ?>
<p class="blad"><?= htmlspecialchars($blad) ?></p>
<?php endif; ?>
<?php if ($nowy_link): ?>
<div class="wynik">
Twój krótki link:<br>
<a href="<?= htmlspecialchars($nowy_link) ?>"><?= htmlspecialchars($nowy_link) ?></a>
</div>
<?php endif; ?>
</body>
</html>
Jak użyć tego skryptu
- Zapisz kod jako
s.phpi wgraj na serwer — pliklinki.jsonutworzy się przy pierwszym skróconym linku. - Dla ładnych adresów
twojadomena.pl/s/Ab3xYzdodaj do.htaccessregułę z komentarza na górze skryptu. - Statystyki kliknięć znajdziesz w pliku
linki.jsonprzy każdym kodzie. - Jeśli skracacz ma być tylko dla Ciebie, zabezpiecz formularz logowaniem (skrypt „Logowanie użytkowników") — publiczne skracacze przyciągają spamerów.
Warto wiedzieć
- Adres docelowy przechodzi walidację
FILTER_VALIDATE_URLplus wymóg http/https — nikt nie zapisze przekierowania np. najavascript:. - Plik JSON w zupełności wystarcza do setek linków; przy tysiącach i dużym ruchu przenieś dane do MySQL (skrypty z kategorii Baza danych).
- Kod przekierowania 301 („przeniesiono na stałe") jest właściwy dla stałych linków; do linków tymczasowych użyj 302.
- Warto zablokować bezpośredni podgląd pliku danych w .htaccess:
<Files "linki.json">Require all denied</Files>.
Podobne skrypty
Pobieranie danych z API (cURL + JSON) na przykładzie kursów NBP
Uniwersalna funkcja pobierania JSON-a z dowolnego API przez cURL — z limitem czasu, obsługą błędów i buforowaniem do pliku. Przykład: aktualne kursy walut z API NBP.
średni Zobacz kod → WWW i APIGenerator mapy strony (sitemap.xml)
Generowanie sitemap.xml dla wyszukiwarek: strony statyczne z tablicy plus wpisy dynamiczne z bazy danych, poprawne kodowanie XML i daty ostatniej modyfikacji.
średni Zobacz kod → WWW i APIObsługa ciasteczek (cookies) + baner zgody bez JavaScriptu
Nowoczesna obsługa cookies w PHP: zapis z flagami SameSite/Secure/HttpOnly, odczyt, usuwanie oraz prosty baner informacyjny o ciasteczkach działający bez JavaScriptu.
początkujący Zobacz kod →