Proposer des URLs courts sur son site statique
Pour un raccourcisseur d'URL maison vous avez besoin d'à peu près 3 choses:
- 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.
- Une fonction qui convertie les nombres naturels (positif et sans décimal) en chaîne de caractère.
- 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.