16Jan

Utiliser YOURLS avec un nom de domaine internationalisé, WordPress et un client Identi.ca ou Twitter

Par , 16 janvier 2011 | Informatique, Webdev | 0 Commentaire

Le conte­nu de cette page est obso­lète ! Le déve­lop­peur de YOURLS a sor­ti un plu­gin offi­ciel pour obte­nir le sup­port des IDN dans YOURLS, que vous pou­vez trou­ver à cette adresse : http://blog.yourls.org/wp-content/uploads/2011/05/yourls-idn.zip (néces­site YOURLS 1.5.1 ou supérieur)

YOURLS (Your Own URL Shor­te­ner) est un script PHP de rac­cour­cis­se­ment d'URL, c'est à dire qu'il fait exac­te­ment la même chose que bit.ly ou goo.gl, pour ne citer qu'eux. Il per­met de créer son propre ser­vice de rac­cour­cis­se­ment d'URL à usage public ou pri­vé, et ain­si de se dédoua­ner des four­nis­seurs de ser­vices tiers pour béné­fi­cier de cette fonc­tion­na­li­té bien pra­tique pour pos­ter une adresse Inter­net sur divers sup­ports tels que les réseaux sociaux tout en béné­fi­ciant d'un sys­tème de sta­tis­tiques sur l'utilisation des adresses réduites créées. Vous pou­vez choi­sir la séquence de carac­tères uti­li­sés pour réduire une URL don­née, un sys­tème pra­tique de plu­gins arti­cu­lé autour de l'API de YOURLS, bref, de toutes les fonc­tion­na­li­tés dont vous pou­vez avoir besoin dans le cadre de la mise en place d'un tel service.

Il y a une foul­ti­tude de rai­sons qui peuvent ame­ner quelqu'un à dési­rer maî­tri­ser le ser­vice de rac­cour­cis­se­ment d'URL qu'il uti­lise, mais le but de cet article n'est pas d'exposer celles qui m'ont pous­sé à mettre en place cette solu­tion pour mon usage per­son­nel. Tou­jours est-il que j'ai récem­ment acquis le nom de domaine caï.eu afin de l'utiliser en tant que ser­vice pri­vé avec YOURLS. Très facile, l'installation s'est dérou­lée sans aucun pro­blème mais mes pre­mières ten­ta­tives d'utilisation se sont sol­dées par une série d'échecs cui­sants. En cause ? Le nom de domaine choisi.

En effet, caï.eu pré­sente la par­ti­cu­la­ri­té sub­tile mais qui ne vous aura pas échap­pée de conte­nir un carac­tère habi­tuel­le­ment absent des noms de domaines car non défi­ni par le stan­dard ASCII : le i tré­ma, « ï ». Il s'agit d'un IDN, ou Nom de Domaine Inter­na­tio­na­li­sé, tel que défi­ni par le stan­dard RFC 3490. Comme le stan­dard défi­nis­sant les noms de machines (RFC 1123) n'autorise pas de tels carac­tères, le pro­to­cole IDNA conver­tit les IDN en noms de domaines conformes au stan­dard ASCII, sous un for­mat appe­lé PUNYCODE. Pour faire court, caï.eu est trans­for­mé par ce pro­cé­dé en xn--ca-uja.eu. C'est trans­pa­rent pour les uti­li­sa­teurs (tant que l'on dis­pose d'un navi­ga­teur Inter­net un tant soit peu civi­li­sé) mais YOURLS, lui, n'aime pas ça. Mais alors, pas du tout.

Si la créa­tion des URL courtes se passe sans pro­blème, leur uti­li­sa­tion est, elle, impos­sible en l'état. Le sys­tème fait une boucle et finit par ren­voyer une erreur 404, avouez que ce n'est pas l'idéal ! Il existe d'ailleurs un rap­port de bug à ce pro­pos, mais le déve­lop­peur de YOURLS a clai­re­ment fait savoir que l'ajout de la prise en charge native des IDN ne fai­sait pas du tout par­tie de ses prio­ri­tés, bien que pré­vue à terme. Heu­reu­se­ment, il y a une solu­tion. Elle n'est pas ce qu'il y a de plus propre, mais elle fonctionne :

NET_IDNA2 requiert PHP >= 5.2.1
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 fonc­tions IDNA natives : idn_to_ascii et idn_to_utf8 (alias : idn_to_unicode).

Il faut tout d'abord télé­char­ger le package NET_IDNA2 ici : http://pear.php.net/package/Net_IDNA2/. Ceci fait, décom­pres­sez-le et copiez le fichier ??/Net_IDNA2‑0.1.1/Net/IDNA2.php qu'il contient dans le dos­sier /includes/ de votre ins­tal­la­tion YOURLS. Main­te­nant, il va fal­loir effec­tuer quelques modifications :

– Édi­tez votre fichier config.php (qui se trouve dans /user/ ou /includes/ selon votre ver­sion 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');
Comme vous pou­vez le remar­quer, il faut uti­li­ser la tra­duc­tion PUNYCODE de son nom de domaine, sinon ça ne fonc­tion­ne­ra pas…

– Main­te­nant, il faut édi­ter 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 modi­fi­ca­tions effec­tuées et dûment enre­gis­trées, vous pour­rez consta­ter que la réso­lu­tion de vos URL rac­cour­cies est main­te­nant plei­ne­ment fonc­tion­nelle. C'est déjà très bien, mais il sub­siste un petit problème.

En effet, s'il vous prend l'envie d'utiliser des logi­ciels tiers fai­sant appel à YOURLS direc­te­ment ou via son API, comme par exemple Chro­med Bird (exten­sion de Chro­mium pour Identi.ca/Twitter) ou le plu­gin Word­Press WP-To-Twit­ter ou l'autre plu­gin YOURLS: Word­Press to Twit­ter, ou que sais-je encore, vous pour­rez vous rendre compte que l'URL retour­née dans votre mes­sage est sous sa forme PUNYCODE. Pas cool du tout, ça…

Voi­ci un hack encore plus sale que le pré­cé­dent mais qui per­met­tra aux logi­ciels tiers de récu­pé­rer la bonne adresse :

– Repre­nez votre fichier config.php et ajou­tez à 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éfi­ni­tion d'URL alter­na­tive pour le cas d'un nom de domaine IDN. Cela va nous per­mettre d'utiliser direc­te­ment notre IDN dans la fonc­tion qui ren­voie l'URL rac­cour­cie au client. Pour cela, il faut appor­ter une petite modi­fi­ca­tion au fichier /includes/functions.php :

– trou­vez le mor­ceau 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 com­mence à la ligne 389 dans mon fichier, il devrait en être à peu près pareil pour vous. Remar­quez les lignes n° 18 et 43 dans le bloc de code ci-des­sus : ce sont celles-ci que nous allons modi­fier. Pas grand chose à faire, d'ailleurs, il suf­fit de rem­pla­cer cha­cune 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 modi­fi­ca­tion donc qui consiste sim­ple­ment à chan­ger YOURLS_SITE en YOURLS_SITE_IDNA, mais une petite modi­fi­ca­tions qui fait toute la dif­fé­rence : vos clients récu­pé­re­ront désor­mais votre URL rac­cour­cie dans le bon for­mat. Ça y est, YOURLS est prêt à être uti­li­sé au maxi­mum de ses possibilités !

Voi­là, en atten­dant que le déve­lop­peur de YOURLS ait le temps et l'envie de se pen­cher sur ce pro­blème, ça per­met d'utiliser de manière plei­ne­ment fonc­tion­nelle cet excellent URL Shor­te­ner sur vos noms de domaines exo­tiques et avec les clients de votre choix.

Rac­cour­cis­sez-bien !

Back to top

Pas peur d'Hadopi

Ce site Web est accessible en




ipv6 ready