Przejdź do treści

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 135 linii Pobierz .php
<?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

  1. Zapisz kod jako s.php i wgraj na serwer — plik linki.json utworzy się przy pierwszym skróconym linku.
  2. Dla ładnych adresów twojadomena.pl/s/Ab3xYz dodaj do .htaccess regułę z komentarza na górze skryptu.
  3. Statystyki kliknięć znajdziesz w pliku linki.json przy każdym kodzie.
  4. 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_URL plus wymóg http/https — nikt nie zapisze przekierowania np. na javascript:.
  • 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>.
#skracacz #linki #przekierowanie #json #random_int

Podobne skrypty