Proposer des URLs courts sur son site statique

Pour un raccourcisseur d'URL maison vous avez besoin d'à peu près 3 choses:

  1. Une liste de vos liens qui pourra être traversée par une boucle. Notez que l'ordre de cette liste doit être immuable; ceux ajoutés a posteriori le seront à la suite des autres.
  2. Une fonction qui convertie les nombres naturels (positif et sans décimal) en chaîne de caractère.
  3. Un accès au fichier de configuration de votre serveur HTTP; car malheuresement la solution que je propose ne peut pas être accomplie à travers un fichier de type .htaccess. Accès peut vouloir dire par vous ou par l'administrateur de votre serveur, si celui-ci est ouvert à vous aider.

Traverser la liste de vos liens

Il faut que l'emsemble des URLs que vous voulez raccourcir soient disponibles sous la forme d'un array. Comme je l'écrivais plus haut, dans ce array, l'ordre doit être immuable, puisque que ce sera le nombre qui, correspond à la position de chaque entrée qui servira à créer la chaîne de caractère courte.

Pour ma part, je stock mes URLs dans un fichier JSON qui, contient un objet dont les clés sont les URLs longs et les valeurs sont les chaînes raccourcies.

Ce JSON est créé lorsque je lance le générateur de site statique pour la première fois. Ensuite, je vérifie son existence et une nouvelle entrée est faite si la clée n'est pas déjà présente dans le JSON en question.

Moi j'ai choisi JSON, mais évidemment, cela pourrait être fait avec un autre format de donnée, comme par exemple SQLite. Sinon, voilà à quoi ressemble ma fonction en lua :

function link.makeshorts()
    local links = {}
    local links_db = Ferron.site.path .. Ferron.site.siteconfig.paths.data .. "/shortlinks.json"

    -- If `links_db` dosen't exists create it
    if path.isfile(links_db) == false then
        local counter = 0

        fileutils.pushfilecontent(links_db, "")

        for k, v in tableutils.sortdescendingpairs(Ferron.site.pagestable) do
            if v.rellink ~= "" then
                counter = counter + 1

                links[v.rellink] = fileutils.shorturlencode(counter)
            end
        end
    else
        links = json.decode(fileutils.pullfilecontent(links_db))

        for k, v in tableutils.sortdescendingpairs(Ferron.site.pagestable) do
            if v.rellink ~= "" and links[v.rellink] == nil then
                links[v.rellink] = fileutils.shorturlencode(tableutils.length(links) + 1)
            end
        end
    end

    return fileutils.pushfilecontent(links_db, json.encode(links, {indent = true}))
end

Convertir les nombres en chaîne de caractère

Dans le bloc de code qui précède, c'est la fonction fileutils.shorturlencode() qui transforme l'identifiant numérique de la position de chaque entrée, en courte chaîne de caractère. C'est ce que l'on appelle une application bijective. J'ai créé une version en lua pour mon générateur de site statique, en me basant sur la version JavaScript que l'on retrouve sur GitHub dans le répertoire ShortURL. D'ailleurs, j'ai ajouté ma contribution à la douzaine de langage déjà présent.

Appliquer les redirection avec RewriteMap

Une fois que les adresses de vos pages sont associées à des URLs courts, il faut les exporter dans un fichier text qui sera utilisé par la directive RewitreMap.

Voici à quoi cela doit ressembler :

## shortlinksmap.txt -- rewriting map

L /note/2017/06/sesame-street-lgbt-pride.html
Q /note/2017/05/twitter-partage-vos-donnees-personnelles.html
23 /note/2017/03/animista-css-animations-on-demand.html
2L /note/2016/08/quoi-ce-n-est-pas-des-femmes-grenouilles.html
M /note/2017/06/petite-contribution-bash-au-task-runner-manuel.html
n /note/2017/12/openbsd-mise-a-jour-reussie.html
4 /note/2018/01/premier-pullrequest-lua-accepte.html
C /note/2017/09/lesbricodeurs-replyto-status-909427743573577728.html
2Q /note/2016/08/snowden-pardon-petition-on-facebook.html
P /note/2017/06/le-velo-cest-dangereux.html
2H /note/2016/09/internet-3-0-peut-on-reprendre-le-controle-des-geants.html

Puis dans votre fichier de configuration de votre site ajouter les directives suivantes. Selon votre version d'Apache il peut y avoir quelques variantes; SVP référez-vous à la documentation pour plus de détails.

## /etc/apache2/sites-available/hugo.soucy.cc.conf

RewriteEngine On
RewriteMap shortlinksmap "txt:/var/www/hugo.soucy.cc/shortlinksmap.txt"
RewriteCond ${shortlinksmap:$1|Unknown} !Unknown
RewriteRule "^/(.*)$" "${shortlinksmap:$1}" [R,L]

Je suppose qu'il existe le même genre de mécanisme pour Nginx ou Lighttpd.


À propos des enjeux autour des URLs courts

Les URLs courts sont souvent visibles sur les réseaux sociaux, tel que Twitter, pour faciliter le partage de lien dans un contexte où le message de l'auteur est limité en caractère; historiquement 140 et maintenant 280 pour les tweets. Le service le plus connu est sans doute bit.ly. Sinon on voit également beaucoup celui de l'omniprésent Google, dont le nom de domaine est goo.gl.

L'utilisation d'un service de raccourcissement fragilise la périnnité des URLs dans nos contenus; puisque si le service en question cesse ses activités du jour au lendemain, tous les liens qu'il redirigait se retrouvent dès lors inutilisables. De plus, que se passerait-il si un service était pirater ou racheter par quelqu'un avec de mauvaises intentions qui, pourrait réaiguiller tous les URLs vers des destinations peu reluisantes ?!

Dans une optique de durabilité et de robustesse il vaut toujours mieux gérer soi-même ses données. Si vous utilisez un CMS comme Drupal ou Wordpress vous avez sans doute accès à des extensions qui vous permettent de mettre en place votre propre raccourcisseur. Et c'est probablement le cas également de générateurs de site statique bien établis comme Jekyll ou Octopress.