Réducteur d'URL

Les sites comme bit.ly ou tinyurl proposent un système de réduction d'URL simple à utiliser et gratuit dans son usage de base.
Mais si vous désirez personnaliser les liens ces outils deviennent payant.
Donc je vous propose une solution simple à mettre en œuvre.

Pourquoi réduire ?

Le nombre de caractères qu'une URL peut contenir est limité. Mais cette limite dépasse le millier de caractères.
La documentation officiel de Microsoft précise que dans Internet Explorer (le mauvais élève du Web) la limite est de 2048 caractères.
http://support.microsoft.com/kb/208427/fr
À titre de comparaison ce billet fait 6846 caractères, espace inclus.
Les cms (dont Dotclear qui propulse ce blogue) ont d'ailleurs tendance à rallonger les URL.
Plus l'URL est longue plus le risque d'erreur est élevé. De plus la génération et l'impression des QRcode sera plus complexe car les motifs seront plus détaillés et plus petits.
En même temps, la plupart des gens ne retiendront pas un URL complexe.
Réduire l'URL permet de limiter ces problèmes et améliore la communication.

Pré-requis

L'outil que j'ai développé nécessite une base de données MySQL et un serveur PHP. De plus votre serveur doit pouvoir gérer des redirections. En pratique la majorité des hébergeurs proposent des offres qui remplissent ces conditions.

Principe

En pratique l'internaute va saisir une URL raccourcie. Comme il n'existe aucun fichier répondant à cette URL le serveur va répondre par un erreur 404. L'astuce est ici.
Grâce à un fichier htaccess l'erreur va être redirigée vers un fichier PHP. Celui-ci récupère l'URL et la compare à une liste sauvegardée dans une base de données.
Si le système trouve une correspondance l'internaute est redirigé vers la bonne URL. Si aucune correspondance n'est trouvée, un message d'erreur s'affiche.

Comme j'imagine que je ne suis pas très clair, voici les détails techniques.

La base de données


CREATE TABLE IF NOT EXISTS `url_liens` (
  `id_liens` char(36) NOT NULL,
  `adresse_liens` varchar(256) NOT NULL,
  `raccourci_liens` varchar(20) NOT NULL,
  PRIMARY KEY (`id_liens`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Une seule table suffit. Il faudra créer trois colonnes, une pour l'index (id_liens), une pour l'URL complète et une la version raccourci.
Au final le code est très simple et facilement adaptable à n'importe quelle base de données SQL.

Le fichier htaccess


# Activation de la redirection
RewriteEngine on
# La liste des erreurs 
ErrorDocument 404 /modules/erreur/erreur.php?err=404

L'instruction « RewriteEngine on » sert à s'assurer que le mécanisme de redirection du serveur est bien activé.
La deuxième ligne liste des erreurs qui vont provoquer une redirection et vers quel fichier la redirection aura lieu. C'est l'instruction « ErrorDocument » qui indique au serveur qu'il doit prend en compte les erreurs.
Dans le cas présent le fichier gère une erreur 404. Pour d'autres type d'erreur il suffit de changer le numéro de l'erreur.
Vous pouvez ajouter autant de ligne que vous le désirez. Par contre le fichier vers lequel vous redirigez l'erreur doit être adapté.
Ensuite vous indiquez le chemin relatif vers le fichier qui fait office de gestionnaire d'erreur.

Le fichier htaccess doit être à la racine de votre site. Mettre le fichier ailleurs vous oblige à modifier le chemin vers le gestionnaire d'erreur, mais risque aussi de rallonger les URL. Ce qui serait contre productif.

Le gestionnaire d'erreur


<?php

	$adresse = $_SERVER['REQUEST_URI'];
	$adresse_2 = str_replace("/", "", $adresse);

/*
*Cette partie concerne la base de données.
*/

//Inclusion du fichier de configuration de la connexion à la Base de Données.
include_once ("../ma_connection.php");

//Requête SQL.
$sql = "SELECT * FROM `url_liens` WHERE `raccourci_liens` LIKE '$adresse_2' LIMIT 1";

//Exécution de la requête.	
$resultat = $dbh->query($sql);
$resultat_lien = $resultat -> fetchall(PDO::FETCH_ASSOC);

//Vérification des résultats.
$compte = count($resultat_lien);

if ($compte != "1"){
	$msg="<h1>Erreur</h1>‹br />";
	$msg.="La page".$site.$_SERVER['REQUEST_URI']." demandée n'existe pas
"; $msg.="Votre IP :".$_SERVER['REMOTE_ADDR']."
"; echo $msg ; } else { $lien = $resultat_lien['0']['adresse_liens']; $redirection = 'Location: '.$lien; header($redirection); } ?>

Dans un premier temps on récupère l'adresse saisie par l'internaute. Par exemple : www.philippe-poisse.eu/contact
Dans cet exemple la variable $adresse ne contiendra que « /contact ». La nom de domaine ne sera pas récupéré par le système. La variable $adresse_2 sert à supprimer le « / », il suffit d'utiliser la fonction str_replace pour cela.
L'adresse réduite est donc correctement récupérée. Il ne reste plus qu'à faire la comparaison avec la base de données.

On va donc commencer par inclure le fichier de configuration pour la base de données. Personnellement j'utilise PDO, ça simplifie le travail.
La requête est un simple « select », pensez toutefois à mettre « LIMIT 1 » pour un peu la sécuriser.
Les deux lignes suivantes c'est du grand classique : on exécute la requête et on récupère le résultat sous forme de tableau associatif.
La variable « $compte » sert à bien vérifié le nombre de ligne contenu dans le tableau. C'est une deuxième sécurité.

Maintenant qu'on a le résultat issu de la base de données on est confronté à deux possibilités :

  • le tableau ne contient qu'une seule ligne, donc le lien pour la redirection existe ;
  • le tableau ne contient aucune ou plusieurs lignes, donc il n'y a pas de lien et on doit afficher un message d'erreur.

Dans le deuxième, si vous avez plusieurs lignes c'est que soit vous avez fait une erreur dans votre base de données soit vous avez été piraté.

Un test conditionnel avec un bon vieux if else va finir le boulot.
Si $compte est différent de 1 (le deuxième cas), on affiche le message d'erreur qui sera contenu dans la variable « $msg ». Je vous laisse libre du contenu du message d'erreur.
Si $compte est égale à 1 la redirection à lieu. Pour rediriger c'est la fonction header qui est utilisée, donc si vous complexifiez votre programme pensez à ne pas envoyer d'information avant d'appeler cette fonction, sinon le système plante lamentablement.

Deux exemples basiques :
Au lieu de taper :
http://www.philippe-poisse.eu/index.php?page=contact
Essayez :
http://www.philippe-poisse.eu/contact

Pareil avec cette URL :
http://www.accessibilite-apf66.org/index.php?page=detail&commune=32
Raccourci en :
http://www.accessibilite-apf66.org/rivesaltes

Vous pouvez aussi rediriger vers un autre site :
par exemple depuis une adresse appartenant au site de l'APF66 :
www.accessibilite-apf66.org/nataph

Au final

Même si je n'ai présenté que la partie « frontoffice » de cet outil, il est très simple à mettre en œuvre. Même si vous n'êtes en mesure de développer un backoffice vous pouvez toujours travailler depuis phpMyAdmin.

Donc maintenant plus d'excuse si vous utiliser des URL à rallonge.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://blog.philippe-poisse.eu/index.php?trackback/53

Fil des commentaires de ce billet