Logo

http://www.gdra.de - Projektseite

RaspberryPi, BananaPi, Programmierung, Let's Play

eigener Kurz-URL-Dienst
verfasst am 24.09.2019 in Programmierung: php

Was ist die Idee dahinter? Ganz einfach, man möchte sich sehr lange URL's einfach mal abkürzen. Im Idealfall kann man sich die Kurz-URL-Links so gestalten, dass man sich diese einfach merken kann.

Was braucht man dazu?
- eine Domain
- einen Server oder Hoster mit php
- ggf. eine MySQL-Datenbank
- ein wenig Zeit

Getestet ist das ganze mit php7.3, sollte auch mit php5.6 funktionieren.

Als erstes benötigt man eine Ansicht zum erstellen, nennen wir sie "url.html".

<html>
        <head>
        </head>
        <body>
                <table align="center">
                        <tr>
                                <td><input type="text" id="link" size="64"></td>
                                <td><input type="button" value="URL erstellen" onclick="url()"></td>
                        </tr>
                        <tr>
                                <td align="center" colspan="2"><br/><br/><u><b>URL:</u></b> <input type="text" id="url" onmouseover="select();" size="64" readonly></td>
                        </tr>
                </table>
        </body>
</html>

Nun haben wir erstmal eine Ansicht, mit der man arbeiten kann. Oben schreibt man die komplette URL rein, unten soll dann der Kurzlink angezeigt werden.
Als nächste benötigen wir ein Javascript, welches die Anfrage weiter gibt und die Antwort erwartet.

<script>
        function url()
                {
                        var req = null;
                        try
                                {
                                        req = new XMLHttpRequest();
                                }
                        catch (ms)
                                {
                                        try
                                                {
                                                        req = new ActiveXObject("Msxml2.XMLHTTP");
                                                }
                                        catch (nonms)
                                                {
                                                        try
                                                                {
                                                                        req = new ActiveXObject("Microsoft.XMLHTTP");
                                                                }
                                                        catch (failed)
                                                                {
                                                                        req = null;
                                                                }
                                                }
                                }

//"&" umformen, macht ein wenig Probleme beim übertragen
                        var amp = document.getElementById("link").value;
                        var anzahl = amp.split("&").length-1;
                        for (i=0;i<anzahl;i++)
                                {
                                        amp = amp.replace("&","-Ampersand-");
                                }
                        req.open("GET","url.php?link="+amp,true);
                        req.onreadystatechange = function()
                                {
                                        switch(req.readyState)
                                                {
                                                        case 4:
                                                                if (req.status == 200)
                                                                        {
//deine.url ersetzen
                                                        document.getElementById("url").value = "http://deine.url/?id="+req.responseText;
                                                                        }
                                                        break;
                                                        default:
                                                                return false;
                                                        break;
                                                }
                                }
                        req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                        req.send(null);
                }
</script>

Jetzt ist das html erstmal fertig. Jetzt kommt das php, hier die "url.php", zum Einsatz. Ich habe mich für eine Variante mit MySQL-Datenbank im Hintergrund entschieden.
Die Datenbank besteht aus 3 Spalten: id, link, url

<?php

        define("SQL_HOST","MySQL-Server"); 
        define("SQL_USER","MySQL-Nutzer");
        define("SQL_DATABASE","MySQL-Datenbank");
        define("SQL_PASS","MySQL-Passwort"); 

        function sql($abfrage)
                {
                        return mysqli_query(mysqli_connect(SQL_HOST,SQL_USER,SQL_PASS,SQL_DATABASE),$abfrage);
                }
                
        function sql_assoc($abfrage)
                {
                        return mysqli_fetch_assoc(sql($abfrage));
                }

        function sql_num($abfrage)
                {
                        return mysqli_num_rows(sql($abfrage));
                }

        function sql_assign($abfrage,$wert)
                {
                        $abfrage = sql_assoc($abfrage);
                        return $abfrage[$wert];
                }
                
        function zahl($var)
                {
                        return preg_match("=^[0-9]+$=i",$var);
                }
                
        function sec_url($kb,$gb,$sz,$z,$u=0)
                {
                        if (!zahl($kb) or !zahl($gb) or !zahl($sz) or !zahl($z) or !zahl($u))
                                {
                                        return false;
                                }
                        else
                                {
                                        $url = array();
                                        $var["kb"] = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n",
                                                                                "o","p","q","r","s","t","u","v","w","x","y","z");
                                        $var["gb"] = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N",
                                                                                "O","P","Q","R","S","T","U","V","W","X","Y","Z");
                                        $var["sz"] = array("_","-");
                                        $var["z"] = array("1","2","3","4","5","6","7","8","9","0");
                                        for ($a=0;$a<$kb;$a++)
                                                {
                                                        $url[] = $var["kb"][rand(0,count($var["kb"])-(($u==1) ? 1 : 4))];
                                                }
                                        for ($a=0;$a<$gb;$a++)
                                                {
                                                        $url[] = $var["gb"][rand(0,count($var["gb"])-(($u==1) ? 1 : 4))];
                                                }
                                        for ($a=0;$a<$sz;$a++)
                                                {
                                                        $url[] = $var["sz"][rand(0,count($var["sz"])-(($u==1) ? 1 : 2))];
                                                }
                                        for ($a=0;$a<$z;$a++)
                                                {
                                                        $url[] = $var["z"][rand(0,count($var["z"])-1)];
                                                }
                                        $var = array();
                                        shuffle($url);
                                        for ($a=0;$a<count($url);$a++)
                                                {
                                                        $url_ret .= $url[$a];
                                                }
                                        $url = array();
                                        return $url_ret;
                                }
                }
                
        if (isset($_GET["link"]))
                {
//3-fache Prüfung ob Kurzlink eventuell existiert, verschiedene Variablen
                        $_GET["link"] = str_replace("-Ampersand-","&",$_GET["link"]);
                        $sec_url = sec_url(3,3,1,1,1);
                        if (sql_num("SELECT * FROM `url` WHERE `url` = '".$sec_url."'") > 0)
                                {
                                        $sec_url = sec_url(3,2,1,2,1);
                                        if (sql_num("SELECT * FROM `url` WHERE `url` = '".$sec_url."'") > 0)
                                                {
                                                        $sec_url = sec_url(2,2,1,3,1);
                                                }
                                }
//Prüfung ob der selbe Link schon existiert um doppelte Einträge zu vermeiden wird der alte Kurzlink ausgelesen
                        $da = sql_assign("SELECT `url` FROM `url` WHERE MD5(`link`) = '".md5($_GET["link"])."'","url");
                        if ($da == "")
                                {
                                        sql("INSERT INTO `url` (`link`,`url`) VALUES ('".mysql_real_escape_string($_GET["link"])."','".$sec_url."')");
                                        $da = sql_assign("SELECT `url` FROM `url` WHERE MD5(`link`) = '".md5($_GET["link"])."'","url");
                                }
                        echo $da;
                }
        else
                {
                        echo "Anweisung nicht verstanden.";
                }

?>

Damit wäre die Möglichkeit zur Erstellung von Kurz-URL-Links fertig. Jetzt muss man diese nur noch auslesen. Dafür brauchen wir eine "index.php" welche wir mit "?id=" ansprechen können.

<?php

        define("SQL_HOST","MySQL-Server"); 
        define("SQL_USER","MySQL-Nutzer");
        define("SQL_DATABASE","MySQL-Datenbank");
        define("SQL_PASS","MySQL-Passwort"); 

        function sql($abfrage)
                {
                        return mysqli_query(mysqli_connect(SQL_HOST,SQL_USER,SQL_PASS,SQL_DATABASE),$abfrage);
                }
                
        function sql_assoc($abfrage)
                {
                        return mysqli_fetch_assoc(sql($abfrage));
                }

        function sql_assign($abfrage,$wert)
                {
                        $abfrage = sql_assoc($abfrage);
                        return $abfrage[$wert];
                }
                
        if (isset($_GET["id"]))
                {
                        $da = sql_assign("SELECT `link` FROM `url` WHERE MD5(`url`) = '".md5($_GET["id"])."'","link");
                        if ($da == "")
                                {
//Fehlerseite das Link nicht da ist
                                        header("Location: http://deine.url/404");
                                }
                        else
                                {
                                        header("Location: ".$da);
                                }
                }
        else
                {
//Fehlerseite das keine Anfrage bzgl. Kurzlink angegeben wurde (?id= fehlt)
                        header("Location: http://deine.url/404");
                }
                
?>

Das wars im Prinzip schon. Funktioniert sehr gut, probiert es einfach mal aus.

Das Script zum downloaden:


InfoPi - Statusübersicht für den Pi

eigener Kurz-URL-Dienst

sichere Passwörter mit php

xapf.de

Impressum

Allgemein (3)

Programmierung (3)
~~> InfoPi (1)
~~> php (2)

[+] Oktober 2019 (1)

[+] September 2019 (2)

[+] August 2019 (1)

[+] Juli 2019 (2)

Datenschutzerklärung

Impressum

xapf.de

©2004-2019 Peter Höche | http://www.gdra.de | Version: 2019-1.02 | Impressum | Datenschutz