Utiliser YOURLS avec un nom de domaine internationalisé, WordPress et un client Identi.ca ou Twitter
YOURLS (Your Own URL Shortener) est un script PHP de raccourcissement d'URL, c'est à dire qu'il fait exactement la même chose que bit.ly ou goo.gl, pour ne citer qu'eux. Il permet de créer son propre service de raccourcissement d'URL à usage public ou privé, et ainsi de se dédouaner des fournisseurs de services tiers pour bénéficier de cette fonctionnalité bien pratique pour poster une adresse Internet sur divers supports tels que les réseaux sociaux tout en bénéficiant d'un système de statistiques sur l'utilisation des adresses réduites créées. Vous pouvez choisir la séquence de caractères utilisés pour réduire une URL donnée, un système pratique de plugins articulé autour de l'API de YOURLS, bref, de toutes les fonctionnalités dont vous pouvez avoir besoin dans le cadre de la mise en place d'un tel service.
Il y a une foultitude de raisons qui peuvent amener quelqu'un à désirer maîtriser le service de raccourcissement d'URL qu'il utilise, mais le but de cet article n'est pas d'exposer celles qui m'ont poussé à mettre en place cette solution pour mon usage personnel. Toujours est-il que j'ai récemment acquis le nom de domaine caï.eu afin de l'utiliser en tant que service privé avec YOURLS. Très facile, l'installation s'est déroulée sans aucun problème mais mes premières tentatives d'utilisation se sont soldées par une série d'échecs cuisants. En cause ? Le nom de domaine choisi.
En effet, caï.eu présente la particularité subtile mais qui ne vous aura pas échappée de contenir un caractère habituellement absent des noms de domaines car non défini par le standard ASCII : le i tréma, « ï ». Il s'agit d'un IDN, ou Nom de Domaine Internationalisé, tel que défini par le standard RFC 3490. Comme le standard définissant les noms de machines (RFC 1123) n'autorise pas de tels caractères, le protocole IDNA convertit les IDN en noms de domaines conformes au standard ASCII, sous un format appelé PUNYCODE. Pour faire court, caï.eu est transformé par ce procédé en xn--ca-uja.eu. C'est transparent pour les utilisateurs (tant que l'on dispose d'un navigateur Internet un tant soit peu civilisé) mais YOURLS, lui, n'aime pas ça. Mais alors, pas du tout.
Si la création des URL courtes se passe sans problème, leur utilisation est, elle, impossible en l'état. Le système fait une boucle et finit par renvoyer une erreur 404, avouez que ce n'est pas l'idéal ! Il existe d'ailleurs un rapport de bug à ce propos, mais le développeur de YOURLS a clairement fait savoir que l'ajout de la prise en charge native des IDN ne faisait pas du tout partie de ses priorités, bien que prévue à terme. Heureusement, il y a une solution. Elle n'est pas ce qu'il y a de plus propre, mais elle fonctionne :
NET_IDNA requiert PHP >= 4.3.0
PHP >= 5.3.0 avec PECL intl >= 1.0.2 ne requiert pas l'utilisation de NET_IDNA/2 car il contient deux fonctions IDNA natives : idn_to_ascii et idn_to_utf8 (alias : idn_to_unicode).
Il faut tout d'abord télécharger le package NET_IDNA2 ici : http://pear.php.net/package/Net_IDNA2/. Ceci fait, décompressez-le et copiez le fichier ??/Net_IDNA2‑0.1.1/Net/IDNA2.php qu'il contient dans le dossier /includes/ de votre installation YOURLS. Maintenant, il va falloir effectuer quelques modifications :
– Éditez votre fichier config.php (qui se trouve dans /user/ ou /includes/ selon votre version de YOURLS). Il s'agit de remplacer
/** YOURLS installation URL, no trailing slash */ define('YOURLS_SITE', 'http://caï.eu');
par
/** YOURLS installation URL, no trailing slash */ /* IDNA support */ $idn = Net_IDNA2::getInstance(); $idn->setParams('utf8', true); $idn->setParams('strict', false); $location = $idn->encode($location); /* End IDNA support */ define('YOURLS_SITE', 'http://xn--ca-uja.eu');
– Maintenant, il faut éditer le fichier /includes/load_yourls.php, et remplacer
// Include settings if(file_exists(dirname(__FILE__).'/config.php') ) { [...]
par
// Include settings // IDNA support require_once (dirname(__FILE__).'/IDNA2.php'); // End IDNA support if(file_exists(dirname(__FILE__).'/config.php') ) { [...]
Une fois ces modifications effectuées et dûment enregistrées, vous pourrez constater que la résolution de vos URL raccourcies est maintenant pleinement fonctionnelle. C'est déjà très bien, mais il subsiste un petit problème.
En effet, s'il vous prend l'envie d'utiliser des logiciels tiers faisant appel à YOURLS directement ou via son API, comme par exemple Chromed Bird (extension de Chromium pour Identi.ca/Twitter) ou le plugin WordPress WP-To-Twitter ou l'autre plugin YOURLS: WordPress to Twitter, ou que sais-je encore, vous pourrez vous rendre compte que l'URL retournée dans votre message est sous sa forme PUNYCODE. Pas cool du tout, ça…
Voici un hack encore plus sale que le précédent mais qui permettra aux logiciels tiers de récupérer la bonne adresse :
– Reprenez votre fichier config.php et ajoutez à la suite des précédentes modifications :
/* IDNA support : YOURLS installation URL alias for IDNA cases, should be the same as YOURLS installation URL above in most cases. No trailing slash. */ /* IDNA support : third-party clients (like ChromedBird, WP-to-Twitter, etc.) retrieve the UTF-8 URL instead of the punycode */ define('YOURLS_SITE_IDNA', 'http://caï.eu')
C'est assez évident : on ajoute une définition d'URL alternative pour le cas d'un nom de domaine IDN. Cela va nous permettre d'utiliser directement notre IDN dans la fonction qui renvoie l'URL raccourcie au client. Pour cela, il faut apporter une petite modification au fichier /includes/functions.php :
– trouvez le morceau de code suivant :
// Custom keyword provided if ( $keyword ) { $keyword = yourls_escape( yourls_sanitize_string($keyword) ); $keyword = yourls_apply_filter( 'custom_keyword', $keyword ); if ( !yourls_keyword_is_free($keyword) ) { // This shorturl either reserved or taken already $return['status'] = 'fail'; $return['code'] = 'error:keyword'; $return['message'] = 'Short URL '.$keyword.' already exists in database or is reserved'; } else { // all clear, store ! yourls_insert_link_in_db( $url, $keyword, $title ); $return['url'] = array('keyword' => $keyword, 'url' => $strip_url, 'title' => $title, 'date' => date('Y-m-d H:i:s'), 'ip' => $ip ); $return['status'] = 'success'; $return['message'] = yourls_trim_long_string( $strip_url ).' added to database'; $return['title'] = $title; $return['html'] = yourls_table_add_row( $keyword, $url, $title, $ip, 0, time() ); $return['shorturl'] = YOURLS_SITE .'/'. $keyword; } // Create random keyword } else { $timestamp = date('Y-m-d H:i:s'); $id = yourls_get_next_decimal(); $ok = false; do { $keyword = yourls_int2string( $id ); $keyword = yourls_apply_filter( 'random_keyword', $keyword ); $free = yourls_keyword_is_free($keyword); $add_url = @yourls_insert_link_in_db( $url, $keyword, $title ); $ok = ($free && $add_url); if ( $ok === false && $add_url === 1 ) { // we stored something, but shouldn't have (ie reserved id) $delete = yourls_delete_link_by_keyword( $keyword ); $return['extra_info'] .= '(deleted '.$keyword.')'; } else { // everything ok, populate needed vars $return['url'] = array('keyword' => $keyword, 'url' => $strip_url, 'title' => $title, 'date' => $timestamp, 'ip' => $ip ); $return['status'] = 'success'; $return['message'] = yourls_trim_long_string( $strip_url ).' added to database'; $return['title'] = $title; $return['html'] = yourls_table_add_row( $keyword, $url, $title, $ip, 0, time() ); $return['shorturl'] = YOURLS_SITE .'/'. $keyword; } $id++; } while (!$ok); @yourls_update_next_decimal($id); }
Pour info, ce bloc commence à la ligne 389 dans mon fichier, il devrait en être à peu près pareil pour vous. Remarquez les lignes n° 18 et 43 dans le bloc de code ci-dessus : ce sont celles-ci que nous allons modifier. Pas grand chose à faire, d'ailleurs, il suffit de remplacer chacune de ces deux lignes par ceci :
/* IDNA support : let third-party clients (like ChromedBird, WP-to-Twitter, etc.) retrieve the UTF-8 URL, not the punycode one */ $return['shorturl'] = YOURLS_SITE_IDNA .'/'. $keyword;
Une petite modification donc qui consiste simplement à changer YOURLS_SITE en YOURLS_SITE_IDNA, mais une petite modifications qui fait toute la différence : vos clients récupéreront désormais votre URL raccourcie dans le bon format. Ça y est, YOURLS est prêt à être utilisé au maximum de ses possibilités !
Voilà, en attendant que le développeur de YOURLS ait le temps et l'envie de se pencher sur ce problème, ça permet d'utiliser de manière pleinement fonctionnelle cet excellent URL Shortener sur vos noms de domaines exotiques et avec les clients de votre choix.
Raccourcissez-bien !