Wróć do case study

Prosty skracacz linków na własnej domenie

Co to jest skracacz linku

Wyobraź sobie, że chcesz wysłać znajomemu link do konkretnego produktu na Allegro lub lokalizacji w Google Maps. Zamiast zgrabnego adresu, dostajesz "tasiemca", który wygląda tak: https://www.google.com/maps/place/Warszawa/xxxxxxx Skracacz zamienia go w coś takiego: twojadomena.pl/warszawa. Możesz oczywisćie skorzystać z darmowego serwisu typu url shortener jak bitly, natomiast biedahosting jest dla ludzi, którzy lubią działać samodzielnie.

Poza tym:

  • Skracacz na własnej domenie to fajna sprawa
  • Możesz edytować linki docelowe
  • Możesz skrócić coś dla znajomych i być królem internetów :)

Krok 0: Zamów hosting Bieda15

Hosting kosztuje 15 PLN na rok i powinien wystarczyć do tego zastosowania.

Krok 1: Kup domenę

Możesz dzialać na darmowej subdomenie od biedahostingu, ale na własnej wygląda to zdecydowanie lepiej. Możesz poszukać domen w lokalnych, np. waw.pl - dzięki temu będziesz miał większy wybór ciekawych adresów. Możesz poszukać promocji u różnych dostawców - ale pamiętaj, że nawet takie super oferty są droższe przy przedłużeniu za rok.

👉 Kup domenę - link afiliacyjny

Krok 2: Podłącz domenę do hostingu

W panelu domeny zmień ustawienia DNS na ns1.microhost.pl i ns2.microhost.pl i dodaj domenę w panelu swojego hostingu przez Zarządzenie kontami-> Zarządzanie domenami -> dodaj nową. Rozpropagowanie zmian w DNS moze zająć dłuższy czas, dlatego wynik może być widoczny nawet następnego dnia.

Krok 3: Podłącz darmowy certyfikat SSL

W panelu hostingu, który otrzymałeś po zakupie przejdż do Zarządzanie kontami -> certyfikaty SSL. Wybierz "Uzyskaj automatyczny certyfikat od dostawcy ACME". Wypełnij pola i wybierz zapisz.

Krok 4: Kod skracacza

Mój kod skacacza wygenerowała sztuczna inteligencja. Możesz oczywisci napisać sam lub poprosić AI o jeszcze lepszy kod. Pamiętaj, że korzystasz z tego kodu na własne ryzyko.

Krok 5: Panel administratora

Dobra dobra, moze nie panel administratora, ale miejsce gdzie będziesz skracał linki. W moim założeniu katalog jest zabezpieczony hasłem, żeby nikt nieuprawniony nie mógł korzystać ze skracacza. Użyłem podstawowej metody logowania przez plik .htaccess - mozesz użyc czegoś bardziej zaawansowanego. Ale do rzeczy:

  • Przejdź do managera plików i do katalogu twojadomena->public_html. Załóż tam folder admin i załóż w nim plik .htaccess
    AuthType Basic
    AuthName "Private link shortener"
    AuthUserFile sciezka_do/.plik_hasel
    Require valid-user
    
    # Ograniczenie dostępu do wybranych IP
    Order deny,allow
    Deny from all
    Allow from TWOJ_IP
    
    

    Do zabezpieczenia dostępu do folderu potrzebujesz plik z zaszyfrowanym hasłem, umieść go poza folderem public_html. Online znajdziesz wiele generatorów haseł wpisz "htpasswd online". Możesz też dodać ograniczenie dostępu tylko dla wybranych adresów IP - sprawdź swój adres wyszukująć strony "my ip".

  • W folderze admin utwórz plik index.php, kóry zapewni interfejs do generownaia skróconych linków. Kod mozesz rozwijać - dodać usuwanie linków, statystyki, wyszykiwarke itd. Kod zapisuje skrócone linki do bazy danych sqlite - czyli do pliku links.db, więc może fajnie umieścić go poza public_html? A może zamiast SQLite użyjesz mysql? Bieda rozwiązania zawsze stanowią wstęp do dalszych poszukiwań.

    Treść pliku:

     <?php
    $db = new PDO('sqlite:links.db');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $db->exec("
    CREATE TABLE IF NOT EXISTS links (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        code TEXT UNIQUE,
        url TEXT,
        clicks INTEGER DEFAULT 0,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )");
    
    function generateCode($length = 4) {
        return substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, $length);
    }
    
    $shortUrl = null;
    
    // OBSŁUGA ZAPISU (NOWY LUB EDYCJA)
    if (!empty($_POST['url'])) {
        $url = trim($_POST['url']);
        
        if (!empty($_POST['edit_code'])) {
            // EDYCJA ISTNIEJĄCEGO LINKU
            $code = $_POST['edit_code'];
            $stmt = $db->prepare("UPDATE links SET url = ? WHERE code = ?");
            $stmt->execute([$url, $code]);
        } else {
            // GENEROWANIE NOWEGO
            $code = generateCode();
            $stmt = $db->prepare("INSERT INTO links (code, url) VALUES (?, ?)");
            $stmt->execute([$code, $url]);
        }
        $shortUrl = $_SERVER['HTTP_HOST'] . '/' . $code;
    }
    
    // POBIERANIE LINKÓW DO LISTY
    $allLinks = $db->query("SELECT * FROM links ORDER BY created_at DESC")->fetchAll(PDO::FETCH_ASSOC);
    
    // POMOCNICZA ZMIENNA DLA FORMULARZA EDYCJI
    $editUrl = '';
    $editCode = '';
    if (isset($_GET['edit'])) {
        $stmt = $db->prepare("SELECT * FROM links WHERE code = ?");
        $stmt->execute([$_GET['edit']]);
        $toEdit = $stmt->fetch();
        if ($toEdit) {
            $editUrl = $toEdit['url'];
            $editCode = $toEdit['code'];
        }
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Bieda skracacz linków v2</title>
        
    </head>
    <body>
    
        <h2><?= $editCode ? "Edytuj link: $editCode" : "Skróć link" ?></h2>
          <p><form method="post" action="?">
            <input type="url" name="url" value="<?= htmlspecialchars($editUrl) ?>" placeholder="https://example.com" required>
            <?php if ($editCode): ?>
                <input type="hidden" name="edit_code" value="<?= $editCode ?>">
                <button>Zapisz zmiany</button></p>
          <p><a href="?">Anuluj edycję</a></p>
          <p><?php else: ?>
                <button>Skróć</button>
            <?php endif; ?>
        </form></p>
          <p><?php if ($shortUrl): ?></p>
          <p>Gotowe!</p>
          <p><input value="https://<?= htmlspecialchars($shortUrl) ?>" readonly onclick="this.select()">
        <?php endif; ?></p>
          <h3>Twoje linki:</h3>
          <p><?php foreach ($allLinks as $link): ?></p>
          <p><strong>/<?= $link['code'] ?></strong><br>
                        "><?= htmlspecialchars($link['url']) ?>
                        <!--div><?= htmlspecialchars($link['url']) ?></div--></p>
          <p><span title="Kliknięcia">🖱️ <?= $link['clicks'] ?> | 
                        <a href="?edit=<?= $link['code'] ?>">Edytuj</a></p>
          <p><?php endforeach; ?></p>
          <p></body>
    </html>
        

Utwórz kod realizujący przekierowania

Wyjdź poziom wyżej z folderu admin, utwrórz tam plk .htaccess

    RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)$ redirect.php?code=$1 [L,QSA]

Obok pliku .htaccess utwórz redirect.php o treści:

<?php
$db = new PDO('sqlite:admin/links.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$code = $_GET['code'] ?? '';

$stmt = $db->prepare("SELECT * FROM links WHERE code = ?");
$stmt->execute([$code]);
$link = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$link) {
    http_response_code(404);
    echo "Link nie istnieje";
    exit;
}

$db->prepare("UPDATE links SET clicks = clicks + 1 WHERE code = ?")
   ->execute([$code]);

header("Location: " . $link['url'], true, 301);
exit;

Dlaczego to działa na tanim hostingu?

Do takiego zadania nie potrzebujesz VPS-a ani chmury. Wystarczy: php i pliki .htaccess Właśnie do takich małych rzeczy powstał BiedaHosting — prosty, tani i bez umów.

👉 Powrót do oferty BiedaHostingu

Chcę przetestować