Hogyan készítsünk egyszerű URL-rövidítőt PHP-val?

Üdvözöllek, webfejlesztő társam! Készen állsz arra, hogy valami igazán hasznosat és szórakoztatót építsünk? Ma egy olyan eszközt fogunk létrehozni, ami nemcsak rendet tesz a hosszú, kusza linkek világában, de még a webfejlesztési tudásodat is elmélyíti. Igen, egy egyszerű URL-rövidítőt fogunk készíteni, a web legnépszerűbb szerveroldali szkriptnyelvével, a PHP-val, és egy megbízható adatbázis-kezelővel, a MySQL-lel.

Képzeld el, hogy a felhasználóidnak nem kell többé gigantikus linkeket másolgatniuk, vagy épp egy Twitter bejegyzésbe zsúfolni a fél kilométeres URL-t. Ehelyett egy rövid, elegáns linket kapnak, ami mögött a mi kis rendszerünk bújik meg. Izgalmasan hangzik, ugye? Vágjunk is bele!

Alapok: Miért van szükség URL-rövidítőre?

Mielőtt belevetnénk magunkat a kódolásba, beszéljünk egy kicsit arról, miért is olyan hasznos egy URL-rövidítő:

  • Esztétika és olvashatóság: Egy hosszú, paraméterekkel teletűzdelt URL igencsak rondán mutat egy emailben, egy nyomtatott anyagon, vagy egy közösségi média posztban. Egy rövid, letisztult link sokkal esztétikusabb és könnyebben megjegyezhető.
  • Karakterkorlátok: Gondoljunk csak a Twitterre, ahol minden karakter számít. Egy rövidített linkkel rengeteg helyet spórolhatunk meg.
  • Követés és analitika: A saját URL-rövidítőnkkel pontosan nyomon követhetjük, hányszor kattintottak egy-egy linkre, honnan érkeztek a látogatók, vagy akár milyen eszközről. Ez értékes információ lehet marketingkampányokhoz vagy tartalomelemzéshez.
  • Márkaépítés: Ha saját domain nevünkön fut az URL-rövidítőnk (pl. sajatom.hu/abcde), az erősíti a márkánk ismertségét és professzionalitását.
  • Rejtett paraméterek: Néha nem szeretnénk, ha a felhasználó látná az URL-ben szereplő összes paramétert. A rövidítés elrejti ezeket.

Láthatod, számos előnye van. Most, hogy megértettük az „miért”-et, jöjjön a „hogyan”!

Előkészületek: Amire szükségünk lesz

Ahhoz, hogy el tudjuk indítani a projektünket, a következőkre lesz szükségünk:

  • Webszerver (Apache vagy Nginx): A PHP kód futtatásához elengedhetetlen. A legtöbb ingyenes tárhely és helyi fejlesztői környezet (pl. XAMPP, WAMP, MAMP) már tartalmazza.
  • PHP: Minimum 7.4-es, de inkább a legújabb stabil verzió ajánlott.
  • MySQL adatbázis: Az URL-ek tárolására.
  • Alapszintű PHP és SQL ismeretek: Bár mindent részletesen elmagyarázok, jó, ha van némi fogalmad a szintaktikáról és az adatbázis-lekérdezésekről.
  • Szövegszerkesztő vagy IDE: (pl. VS Code, Sublime Text, PhpStorm) a kód írásához.
  • Webböngésző: A teszteléshez.

Ha mindez megvan, készen állunk!

A projekt felépítése és működési elve

Egy URL-rövidítő működési elve viszonylag egyszerű:

  1. A felhasználó megadja a hosszú URL-t.
  2. A rendszer generál egy rövid kódot (pl. abcde).
  3. A hosszú URL-t és a rövid kódot eltárolja egy adatbázisban.
  4. Amikor valaki megnyitja a rövidített URL-t (pl. sajatom.hu/abcde), a rendszer lekérdezi az adatbázisból a hozzá tartozó hosszú URL-t, majd átirányítja a felhasználót arra az URL-re.

Projektünk fájlstruktúrája a következő lesz:

  • config.php: Az adatbázis kapcsolódási adatai.
  • index.php: Ez lesz a fő fájl, ami kezeli az URL-ek rövidítését és az átirányításokat is.
  • .htaccess: Az Apache webszerver számára szóló konfigurációs fájl, ami lehetővé teszi a „szép URL-ek” használatát (pl. sajatom.hu/abcde a sajatom.hu/index.php?code=abcde helyett).

1. Lépés: Az adatbázis előkészítése

Először is hozzunk létre egy adatbázist és egy táblát az URL-eink tárolására. Jelentkezz be a phpMyAdmin-ba vagy a kedvenc MySQL kliensedbe, és futtasd le a következő SQL parancsokat:


CREATE DATABASE IF NOT EXISTS url_shortener CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE url_shortener;

CREATE TABLE IF NOT EXISTS urls (
    id INT AUTO_INCREMENT PRIMARY KEY,
    long_url TEXT NOT NULL,
    short_code VARCHAR(10) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Nézzük meg, mit csináltunk:

  • CREATE DATABASE IF NOT EXISTS url_shortener ...;: Létrehoztunk egy url_shortener nevű adatbázist, ha még nem létezne, és beállítottuk a karakterkódolását.
  • USE url_shortener;: Kiválasztottuk az újonnan létrehozott adatbázist.
  • CREATE TABLE IF NOT EXISTS urls (...): Létrehoztunk egy urls nevű táblát.
    • id INT AUTO_INCREMENT PRIMARY KEY: Egy automatikusan növekvő egyedi azonosító minden rekordhoz.
    • long_url TEXT NOT NULL: Ez tárolja a hosszú, eredeti URL-t. TEXT típust használunk, mert az URL-ek lehetnek nagyon hosszúak.
    • short_code VARCHAR(10) UNIQUE NOT NULL: Ez tárolja a generált rövid kódot. VARCHAR(10)-et használunk, ami elegendő egy 6-10 karakteres kódhoz. A UNIQUE megkötés biztosítja, hogy minden rövid kód egyedi legyen.
    • created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP: Ez automatikusan rögzíti az URL rövidítésének időpontját.

Ezzel az adatbázisunk készen áll az adatok fogadására.

2. Lépés: A konfigurációs fájl (config.php)

Hozzuk létre a config.php fájlt, ami tartalmazza az adatbázisunkhoz való kapcsolódáshoz szükséges adatokat. Ezeket a PHP PDO (PHP Data Objects) kiterjesztésén keresztül fogjuk használni, ami egy modern és biztonságos módja az adatbázisokkal való kommunikációnak.


<?php
/**
 * Adatbázis kapcsolódási adatok és PDO inicializálás
 */

// Adatbázis paraméterek
define('DB_SERVER', 'localhost'); // Az adatbázis szerver címe (általában localhost)
define('DB_USERNAME', 'root');    // Az adatbázis felhasználóneve
define('DB_PASSWORD', '');        // Az adatbázis jelszava (XAMPP/WAMP esetén gyakran üres)
define('DB_NAME', 'url_shortener'); // Az adatbázis neve, amit létrehoztunk

// PDO objektum létrehozása és adatbázis kapcsolódás
try {
    $pdo = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USERNAME, DB_PASSWORD);
    // Hibaüzenetek beállítása kivételként, hogy könnyebb legyen kezelni
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // Adatok lekérése asszociatív tömbként alapértelmezetten
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    // Ha hiba történik a kapcsolódás során, leállítjuk a szkriptet és kiírjuk a hibaüzenetet
    die("Hiba az adatbázis kapcsolódás során: " . $e->getMessage());
}
?>

Fontos: A DB_USERNAME és DB_PASSWORD értékeket a saját adatbázis beállításaidnak megfelelően módosítsd! Helyi fejlesztés során a root felhasználónév jelszó nélkül gyakori, de éles környezetben SOHA ne használj root felhasználót, és mindig legyen erős jelszavad!

3. Lépés: A fő logikai fájl (index.php)

Ez lesz a projekt szíve. Ez a fájl fogja tartalmazni az URL rövidítő formját, a rövidítés logikáját, és az átirányítás logikáját is. Éppen ezért eléggé hosszú lesz, de lépésről lépésre végigmegyünk rajta.


<?php
require_once 'config.php'; // Betöltjük az adatbázis kapcsolódást

$longUrl = ''; // Változó a hosszú URL tárolására (formban is használjuk)
$shortCode = ''; // Változó a generált rövid kód tárolására
$message = ''; // Változó a felhasználóknak szóló üzenetekhez

/**
 * Rövid kód generálása és egyediségének ellenőrzése
 * @param PDO $pdo A PDO adatbázis kapcsolat objektum
 * @param int $length A generált rövid kód hossza
 * @return string Az egyedi rövid kód
 */
function generateShortCode(PDO $pdo, $length = 6) {
    // Engedélyezett karakterek a rövid kódban (alfanumerikus)
    $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charsLength = strlen($chars);
    $isUnique = false;
    $randomString = '';

    // Generálunk egy kódot, és ellenőrizzük, hogy egyedi-e az adatbázisban
    // Ha nem egyedi, generálunk egy újat, amíg nem találunk egyedit
    while (!$isUnique) {
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $chars[rand(0, $charsLength - 1)];
        }

        // Ellenőrizzük az egyediséget
        $stmt = $pdo->prepare("SELECT COUNT(*) FROM urls WHERE short_code = :short_code");
        $stmt->bindParam(':short_code', $randomString);
        $stmt->execute();
        
        if ($stmt->fetchColumn() == 0) { // Ha 0 találat van, akkor a kód egyedi
            $isUnique = true;
        }
    }
    return $randomString;
}

// ----- URL RÖVIDÍTÉSI LOGIKA (POST kérés esetén) -----
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['long_url'])) {
    $longUrl = trim($_POST['long_url']);

    // URL validálás
    if (!filter_var($longUrl, FILTER_VALIDATE_URL)) {
        $message = '<p class="error">Kérlek érvényes URL címet adj meg!</p>';
    } else {
        try {
            // Először ellenőrizzük, hogy ez az URL már létezik-e rövidítve
            $stmt = $pdo->prepare("SELECT short_code FROM urls WHERE long_url = :long_url LIMIT 1");
            $stmt->bindParam(':long_url', $longUrl);
            $stmt->execute();
            $existingShortCode = $stmt->fetchColumn();

            if ($existingShortCode) {
                // Ha már létezik, azt adjuk vissza
                $shortCode = $existingShortCode;
                $message = '<p class="info">Ez az URL már rövidítve lett: <a href="/' . htmlspecialchars($shortCode) . '" target="_blank">' . htmlspecialchars($_SERVER['HTTP_HOST']) . '/' . htmlspecialchars($shortCode) . '</a></p>';
            } else {
                // Ha nem létezik, generálunk egy új rövid kódot
                $shortCode = generateShortCode($pdo);
                
                // Adatbázisba beillesztés
                $stmt = $pdo->prepare("INSERT INTO urls (long_url, short_code) VALUES (:long_url, :short_code)");
                $stmt->bindParam(':long_url', $longUrl);
                $stmt->bindParam(':short_code', $shortCode);

                if ($stmt->execute()) {
                    $message = '<p class="success">Az URL sikeresen rövidítve lett: <a href="/' . htmlspecialchars($shortCode) . '" target="_blank">' . htmlspecialchars($_SERVER['HTTP_HOST']) . '/' . htmlspecialchars($shortCode) . '</a></p>';
                } else {
                    $message = '<p class="error">Hiba történt az URL rövidítése során. Kérlek próbáld újra!</p>';
                }
            }
        } catch (PDOException $e) {
            $message = '<p class="error">Adatbázis hiba: ' . htmlspecialchars($e->getMessage()) . '</p>';
        }
    }
} 
// ----- URL ÁTIRÁNYÍTÁSI LOGIKA (GET kérés, ha rövid kóddal hívják meg) -----
else if (isset($_GET['code']) && !empty($_GET['code'])) {
    $code = trim($_GET['code']);

    try {
        $stmt = $pdo->prepare("SELECT long_url FROM urls WHERE short_code = :short_code");
        $stmt->bindParam(':short_code', $code);
        $stmt->execute();
        $result = $stmt->fetch(); // Alapértelmezett fetch mód: ASSOC

        if ($result) {
            // Átirányítás a hosszú URL-re
            header("Location: " . $result['long_url']);
            exit(); // Nagyon fontos az exit(), hogy a szkript leálljon az átirányítás után
        } else {
            // Ha a rövid kód nem található, 404-es hiba
            header("HTTP/1.0 404 Not Found");
            echo "<!DOCTYPE html><html lang='hu'><head><meta charset='UTF-8'><title>404 Nem található</title><style>body{font-family: Arial, sans-serif; text-align: center; margin-top: 50px;}</style></head><body><h1>404 - A rövidített URL nem található.</h1><p>A keresett rövidített URL nem létezik vagy lejárt.</p><p><a href='/'>Vissza a főoldalra</a></p></body></html>";
            exit();
        }
    } catch (PDOException $e) {
        // Adatbázis hiba esetén
        header("HTTP/1.0 500 Internal Server Error");
        echo "<!DOCTYPE html><html lang='hu'><head><meta charset='UTF-8'><title>500 Belső szerver hiba</title><style>body{font-family: Arial, sans-serif; text-align: center; margin-top: 50px;}</style></head><body><h1>500 - Belső szerver hiba</h1><p>Adatbázis hiba történt az átirányítás során.</p></body></html>";
        exit();
    }
}
// ----- HTML KÓD (az URL rövidítő űrlapja) -----
?>
<!DOCTYPE html>
<html lang="hu">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Egyszerű URL Rövidítő PHP-val</title>
    <meta name="description" content="Hozd létre saját URL rövidítődet PHP-val és MySQL-lel. Egyszerű, gyors és könnyen használható.">
    <meta name="keywords" content="URL rövidítő, PHP, MySQL, webfejlesztés, rövidített link, redirect, htaccess, saját URL rövidítő">
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f4f7f6;
            color: #333;
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            min-height: 100vh;
        }
        .container {
            background-color: #ffffff;
            padding: 30px 40px;
            border-radius: 10px;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
            max-width: 600px;
            width: 100%;
            text-align: center;
        }
        h1 {
            color: #2c3e50;
            margin-bottom: 25px;
            font-size: 2.2em;
        }
        p {
            line-height: 1.6;
        }
        .message {
            padding: 12px 20px;
            margin-bottom: 20px;
            border-radius: 8px;
            font-weight: bold;
            display: block;
            text-align: left;
        }
        .message.success {
            background-color: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        .message.error {
            background-color: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        .message.info {
            background-color: #d1ecf1;
            color: #0c5460;
            border: 1px solid #bee5eb;
        }
        form {
            display: flex;
            flex-direction: column;
            gap: 15px;
            margin-top: 20px;
        }
        input[type="url"] {
            padding: 12px 15px;
            border: 1px solid #ccc;
            border-radius: 8px;
            font-size: 1em;
            width: calc(100% - 30px);
            box-sizing: border-box;
        }
        input[type="url"]:focus {
            border-color: #007bff;
            outline: none;
            box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
        }
        button[type="submit"] {
            background-color: #007bff;
            color: white;
            padding: 12px 25px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            font-size: 1.1em;
            font-weight: bold;
            transition: background-color 0.3s ease;
        }
        button[type="submit"]:hover {
            background-color: #0056b3;
        }
        a {
            color: #007bff;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1><strong>Egyszerű URL Rövidítő</strong></h1>
        <p>Írd be az alábbi mezőbe a hosszú URL-t, és mi rövidítjük neked, hogy könnyedén megoszthasd!</p>
        
        <?php if (!empty($message)): ?>
            <div class="message <?php echo strpos($message, 'sikeresen') !== false ? 'success' : (strpos($message, 'Hiba') !== false ? 'error' : 'info'); ?>">
                <?php echo $message; ?>
            </div>
        <?php endif; ?>

        <form method="POST" action="index.php">
            <input type="url" name="long_url" placeholder="Példa: https://www.valami-hosszuepitesu-weboldal.hu/ez-egy-nagyon-hosszadalmas-link-amit-roviditeni-szeretnenk?parameter1=ertek&parameter2=masikertek" required value="<?php echo htmlspecialchars($longUrl); ?>">
            <button type="submit"><strong>Rövidítés</strong></button>
        </form>
    </div>
</body>
</html>

Az index.php magyarázata:

  • require_once 'config.php';: Ez a sor betölti az adatbázis kapcsolódási adatokat és létrehozza a $pdo objektumot, amit a lekérdezésekhez használunk.
  • generateShortCode() függvény: Ez a funkció felelős az egyedi, 6 karakteres rövid kódok generálásáért.
    • Alfanumerikus karaktereket használ.
    • A while (!$isUnique) ciklus biztosítja, hogy a generált kód valóban egyedi legyen az adatbázisban, mielőtt visszaadná. Ez a COUNT(*) lekérdezéssel történik.
    • Ez egy egyszerű megvalósítás. Profi rendszerek ennél bonyolultabb algoritmusokat (pl. Base62 kódolást az ID-ból) is használnak, ami garantáltabban egyedi és ütközésmentes.
  • URL rövidítési logika (if ($_SERVER['REQUEST_METHOD'] === 'POST' ...)):
    • Ellenőrzi, hogy POST kéréssel érkezett-e az űrlap elküldése.
    • A trim() eltávolítja a felesleges szóközöket az URL elejéről és végéről.
    • filter_var($longUrl, FILTER_VALIDATE_URL): Ez egy biztonságos és hatékony módja az URL érvényességének ellenőrzésére.
    • Először megpróbáljuk lekérdezni, hogy az adott hosszú URL már létezik-e az adatbázisunkban. Ha igen, akkor azt a rövid kódot adjuk vissza, így elkerülve a felesleges duplikációkat.
    • Ha nem létezik, generálunk egy új rövid kódot, majd a PDO prepared statements segítségével biztonságosan beillesztjük az adatokat az adatbázisba. A bindParam() védekezik az SQL injekciók ellen.
    • Sikeres mentés után megjelenítjük a rövidített URL-t.
    • Hiba esetén (pl. validációs hiba, adatbázis hiba) megfelelő üzenetet jelenítünk meg.
  • URL átirányítási logika (else if (isset($_GET['code']) ...)):
    • Ez a rész akkor lép életbe, ha az index.php fájlt egy rövid kóddal hívják meg, amit az .htaccess fájl fog a code GET paraméterbe tenni.
    • A kódot lekérdezzük az adatbázisból.
    • Ha találunk hozzá hosszú URL-t, akkor a header("Location: ...") függvénnyel átirányítjuk a felhasználót az eredeti URL-re. Az exit() itt kritikus fontosságú, hogy megakadályozza a további kód futását az átirányítás után.
    • Ha nem találjuk a kódot, 404-es HTTP státuszkódot küldünk, és egy felhasználóbarát 404-es oldalt jelenítünk meg.
  • HTML struktúra és CSS:
    • Egy egyszerű HTML formot tartalmaz az URL beviteléhez és a rövidítés gombjához.
    • A htmlspecialchars() függvényt minden kimenő adatnál használjuk (pl. a rövidített URL linkjének kiírásánál), hogy védekezzünk az XSS (Cross-Site Scripting) támadások ellen.
    • A beépített CSS stílusok egy alapvető, de esztétikus megjelenést biztosítanak az űrlapnak és az üzeneteknek.

4. Lépés: A .htaccess fájl

Ez a fájl teszi lehetővé, hogy a rövidített linkjeink szépen nézzenek ki (pl. sajatom.hu/abcde a sajatom.hu/index.php?code=abcde helyett). Hozd létre a .htaccess fájlt ugyanabban a könyvtárban, ahol az index.php és a config.php is található, és másold bele a következő kódot:


<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Ha a kérés egy létező fájlra vagy könyvtárra vonatkozik, hagyjuk figyelmen kívül
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # Ha a kérés egy 6-10 karakter hosszú alfanumerikus string,
    # akkor irányítsuk át az index.php-nak 'code' paraméterrel
    RewriteRule ^([a-zA-Z0-9]{6,10})$ index.php?code=$1 [L]
</IfModule>

A .htaccess magyarázata:

  • <IfModule mod_rewrite.c>: Ez ellenőrzi, hogy az Apache mod_rewrite modulja engedélyezve van-e. Enélkül az átírás nem működne.
  • RewriteEngine On: Bekapcsolja az átírási motort.
  • RewriteBase /: Megadja az alapkönyvtárat, ahonnan az átírások indulnak. Ezt valószínűleg a gyökérkönyvtárra kell állítani, ha a projekt a domain gyökerében van.
  • RewriteCond %{REQUEST_FILENAME} !-f és RewriteCond %{REQUEST_FILENAME} !-d: Ezek a feltételek azt mondják, hogy az átírásokat csak akkor alkalmazzuk, ha a kért URL NEM egy létező fájl (-f) és NEM egy létező könyvtár (-d). Ez megakadályozza, hogy például a CSS vagy JS fájlokra vonatkozó kérések is átírásra kerüljenek.
  • RewriteRule ^([a-zA-Z0-9]{6,10})$ index.php?code=$1 [L]: Ez a fő átírási szabály.
    • ^([a-zA-Z0-9]{6,10})$: Ez egy reguláris kifejezés, ami megvizsgálja a bejövő URL-t. Azt keresi, hogy az URL gyökérkönyvtára után (pl. sajatom.hu/ után) pontosan 6-10 karakter hosszú, csak angol betűket (kis- és nagybetűket) és számokat tartalmazó string van-e. A zárójelek (()) elfogják ezt a stringet egy csoportba.
    • index.php?code=$1: Ha a minta illeszkedik, az URL-t átírja erre a belső útvonalra. A $1 hivatkozik az első elfogott csoportra (a rövid kódra).
    • [L]: A Last zászló azt jelenti, hogy ha ez a szabály illeszkedik, akkor az Apache ne keressen további átírási szabályokat.

Ha nem Apache webszervert használsz (pl. Nginx), akkor másfajta konfigurációra lesz szükséged, de az elv hasonló: át kell irányítani a rövid kódokat az index.php fájlra egy paraméterrel.

Tesztelés és használat

Most, hogy minden fájl a helyén van, teszteljük is le!

  1. Töltsd fel a fájlokat (config.php, index.php, .htaccess) a webszervered gyökérkönyvtárába (vagy egy alkönyvtárba).
  2. Nyisd meg a böngésződben a domain nevedet (pl. http://localhost/url-shortener/ vagy http://sajatom.hu/).
  3. Meg kell jelennie az URL rövidítő űrlapjának.
  4. Írj be egy hosszú URL-t (pl. https://hu.wikipedia.org/wiki/Programoz%C3%A1si_nyelvek_list%C3%A1ja), majd kattints a „Rövidítés” gombra.
  5. Ha minden jól megy, kapsz egy rövidített URL-t (pl. http://localhost/url-shortener/ABCDEF).
  6. Kattints rá erre a rövidített linkre, és ellenőrizd, hogy átirányít-e az eredeti hosszú URL-re.
  7. Próbálj meg egy nem létező rövidített URL-t megnyitni (pl. http://localhost/url-shortener/NEMLETEREK), ekkor meg kell jelennie a 404-es hibaoldalunknak.

Biztonsági megfontolások és továbbfejlesztések

Az általunk épített URL rövidítő egy remek alap, de mint minden webes alkalmazás, ez is továbbfejleszthető és biztonságosabbá tehető:

  • SSL/TLS (HTTPS): Mindig használj HTTPS-t a domaineden! Ez titkosítja a kommunikációt a felhasználó böngészője és a szerver között, megvédve az adatokat.
  • Szigorúbb validáció: Bár a filter_var(..., FILTER_VALIDATE_URL) jó, kiegészítheted további ellenőrzésekkel (pl. feketelista tiltott domainekre, vagy ellenőrzöd, hogy az URL elérhető-e).
  • Rövid kód generálása: A jelenlegi random generálás ütközéseket okozhat (bár az egyediségi ellenőrzés megoldja), és hosszabb időt vehet igénybe, ha sok URL-t rövidítenek. Gondolkodhatsz el a Base62 kódolás használatán (pl. az adatbázis ID-jából generálsz rövid kódot), ami garantáltan egyedi és hatékonyabb.
  • Adatbázis backup: Rendszeresen készíts biztonsági mentést az adatbázisról!
  • Látogatottság mérése: Kiegészítheted a urls táblát egy clicks oszloppal (INT DEFAULT 0), amit minden átirányításkor megnövelsz. Ezzel alapvető statisztikákat kaphatsz.
  • Felhasználói felület: Egy fejlettebb CSS és JavaScript segítségével sokkal interaktívabb és vonzóbb felületet készíthetsz.
  • Admin felület: Készíthetsz egy jelszóval védett admin felületet, ahol listázhatod, szerkesztheted, törölheted a rövidített URL-eket, és láthatod a statisztikájukat.
  • API: Ha szeretnéd, hogy más alkalmazások is tudjanak URL-eket rövidíteni a rendszereden keresztül, készíthetsz hozzá egy egyszerű REST API-t.
  • Lejárati idő: Adhatsz a rövidített URL-eknek lejárati időt, utána törölhetők vagy inaktiválhatók.

Összefoglalás

Gratulálok! Sikeresen elkészítetted az első saját PHP és MySQL alapú URL-rövidítődet. Ez a projekt nemcsak egy praktikus eszközt ad a kezedbe, hanem számos fontos webfejlesztési koncepciót is megmutatott: adatbázis-kezelés PDO-val, URL validáció, szerveroldali logika, .htaccess átírások és alapvető biztonsági elvek.

Ahogy láthattad, még egy ilyen egyszerű alkalmazás is milyen sok részletet rejt magában. Ne feledd, a kódolás folyamatos tanulás és fejlődés. Használd ezt az alapot, kísérletezz vele, bővítsd a tudásodat, és építs még nagyszerűbb dolgokat!

Sok sikert a további fejlesztésekhez!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük