<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>l'indicible blog &#187; SEO</title>
	<atom:link href="http://www.lindicible.com/blog/category/dev/seo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lindicible.com/blog</link>
	<description>&#60;!--:en--&#62;the details of the inexpressible&#60;!--:--&#62;&#60;!--:fr--&#62;les détails de l'ineffable&#60;!--:--&#62;</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:20:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comment ajouter automatiquement un slash en fin d&#8217;URL</title>
		<link>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/</link>
		<comments>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:55:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=548</guid>
		<description><![CDATA[Après de longues et fastidieuses recherches pour ajouter automatiquement un slash ( &#8216;/&#8217; ) à la fin des adresses de mes sites web, j&#8217;ai pensé que certains pourraient profiter du fruit de ces recherches&#8230;
Pour ceux qui se demanderaient quel est le but de la manœuvre, il s&#8217;agit encore une fois d&#8217;un souci de référencement.
En effet, [...]]]></description>
			<content:encoded><![CDATA[<p>Après de longues et fastidieuses recherches pour ajouter automatiquement un slash ( &#8216;/&#8217; ) à la fin des adresses de mes sites web, j&#8217;ai pensé que certains pourraient profiter du fruit de ces recherches&#8230;</p>
<p>Pour ceux qui se demanderaient quel est le but de la manœuvre, il s&#8217;agit encore une fois d&#8217;un souci de référencement.<br />
En effet, pour un moteur de recherche, http://www.siteweb.com/nom et http://www.siteweb.com/nom/ ne sont pas équivalents. Ceci est hérité d&#8217;une époque où /nom représentait un fichier et /nom/ un répertoire. Rien alors n&#8217;empêchait d&#8217;avoir au même endroit un répertoire et un fichier du même nom.</p>
<p>Aujourd&#8217;hui, on a pris l&#8217;habitude de rendre les URIs plus clairs et plus simples pour les utilisateurs, et la plupart du temps on s&#8217;arrange pour que http://www.siteweb.com/nom et http://www.siteweb.com/nom/ renvoient sur la même page.<br />
Une fois encore, le risque est de se retrouver avec deux pages considérées comme des doublons par les moteurs de recherche, diluant le référencement global de la page.<br />
Pour éviter cela, on va donc chercher à avoir une page canonique, et à renvoyer l&#8217;autre sur celle-ci.</p>
<p>Il existe plusieurs façons de faire ça, la plus simple étant probablement l&#8217;usage de <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&#038;answer=139394" rel="external">l&#8217;attribut &laquo;&nbsp;canonical&nbsp;&raquo;</a> récemment introduit par Google.<br />
Pour référence, il s&#8217;agit d&#8217;introduire un tag du type &lt;link rel=&quot;canonical&quot; href=&quot;http://www.creation-de-sites-web.com/w3c.php?quality=high&quot;&gt; dans la balise &lt;head&gt; de la page en question. Ainsi, plusieurs URLs pourront pointer sur cette page, mais Google sera informé que c&#8217;est l&#8217;adresse indiquée dans ce href qui fait référence.</p>
<p>Une autre méthode consiste à systématiquement rediriger le visiteur sur l&#8217;adresse de page que l&#8217;on souhaite mettre en avant.<br />
Ceci peut se faire au niveau de la page elle même (par exemple <a href="http://fr2.php.net/manual/fr/function.header.php" rel="external">en php</a>), mais il est probablement beaucoup plus approprié de le faire au niveau du serveur web (Apache) ou d&#8217;un fichier .htaccess.</p>
<p>On a alors plusieurs outils à notre disposition, liés à mod_alias et mod_rewrite (pensez à vérifier qu&#8217;ils sont bien activés sur votre hébergement avant de commencer à expérimenter! Ce n&#8217;est pas toujours le cas)</p>
<p>Mes expérimentations m&#8217;ont fait passer de RewriteRule à RedirectMatch, puis de retour sur RewriteRule pour un résultat qui m&#8217;a enfin paru satisfaisant.<br />
En guise de documentation, je vous invite à visiter la documentation Apache, notamment les liens suivants :<br />
<a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule" rel="external">http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule</a><br />
<a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog" rel="external">http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog</a></p>
<p>Sans plus de préambule, voici ma solution :</p>
<pre>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.+[^/])$  %{REQUEST_URI}/  [R=301,L]

RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Détaillons un petit peu :</p>
<pre>
RewriteEngine On
</pre>
<p>On s&#8217;assure que le moteur de ré-écriture d&#8217;URL est allumé. S&#8217;il n&#8217;est pas disponible, on aura généralement une erreur 500.</p>
<p>On va ensuite tester différents cas de figure :</p>
<pre>
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]
</pre>
<p>Si le lien pointe vers un fichier de taille non nulle (-s = sized file)<br />
ou bien<br />
que le lien pointe vers un lien (-l = link)<br />
ou bien<br />
que le lien pointe vers un répertoire (-d = directory)<br />
ou bien que l&#8217;URI commence par /blog/ sans tenir compte de la casse (NC = Not Case-sensitive)<br />
alors on va remplacer l&#8217;URL par elle même (-) et ignorer les règles suivantes (L = Last rule)</p>
<pre>
RewriteRule ^.*[^/]$  %{REQUEST_URI}/  [R=301,L]
</pre>
<p>Si l&#8217;on est toujours là, c&#8217;est que les conditions précédentes n&#8217;ont pas été remplies.<br />
On est donc pas en présence d&#8217;un fichier/lien/répertoire ni d&#8217;une entrée du blog (que nous avons mis ici à titre d&#8217;exemple d&#8217;un élément d&#8217;arborescence à exclure&#8230; A noter que les blogs comme Wordpress ont leur propre système de ré-écriture d&#8217;URLs).<br />
On va alors remplacer tout ce qui ne finit pas par un / ( soit ^.*[^/]$ en expression régulière ) par l&#8217;adresse visée suivie d&#8217;un / ( %{REQUEST_URI}/ ) et faire une redirection externe sur cette adresse (R = Redirect, 301 = le code d&#8217;erreur que l&#8217;on souhaite envoyer ).<br />
Ceci sera notre dernière règle (L = Last), afin d&#8217;éviter qu&#8217;elle ne soit remplacée par une autre avant que la redirection n&#8217;ait été prise en compte (ça n&#8217;a l&#8217;air de rien, mais j&#8217;ai du perdre un certain nombre de cheveux avant de comprendre ça!)</p>
<p>Enfin, dans le cadre de nos projets à URLs customisées, on va généralement renvoyer tout le reste sur le fichier index.php qui s&#8217;occupera de l&#8217;interpréter : </p>
<pre>
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Peut-être y a-t-il de meilleures façons de procéder. Si c&#8217;est le cas, je serai ravi de les découvrir.<br />
Quoi qu&#8217;il en soit, n&#8217;hésitez pas à laisser un commentaire, ça fait toujours plaisir <img src='http://www.lindicible.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOMDocument et UTF-8, un problème de charset en php</title>
		<link>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/</link>
		<comments>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 23:44:11 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=481</guid>
		<description><![CDATA[Aujourd&#8217;hui, nous allons voir comment manipuler des éléments du DOM avec php.
Nous prendrons pour exemple une fonction très pratique mais pourtant apparamment bien difficile à trouver : commenter ajouter un attribut spécifique à des éléments HTML.
Ceci peut-être utile par exemple pour ajouter un attribut rel=&#160;&#187;nofollow&#160;&#187; à des liens pour signaler aux moteurs de recherche qu&#8217;ils [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, nous allons voir comment manipuler des éléments du <a href="http://fr.wikipedia.org/wiki/Document_Object_Model" rel="external">DOM</a> avec php.<br />
Nous prendrons pour exemple une fonction très pratique mais pourtant apparamment bien difficile à trouver : commenter ajouter un attribut spécifique à des éléments HTML.<br />
Ceci peut-être utile par exemple pour ajouter un attribut rel=&nbsp;&raquo;nofollow&nbsp;&raquo; à des liens pour signaler aux moteurs de recherche qu&#8217;ils n&#8217;ont pas à les suivre, tout en laissant ces liens accessibles pour vos utilisateurs. D&#8217;un point de vue référencement, ça peut être bien pratique puisque cela vous évite de voir votre PageRank être dispersé vers tous les liens présents sur vos pages.</p>
<p>Pour arriver à ce but, nous allons rencontrer plusieurs problèmes assez vicieux. Commençons par une fonction aboutie, pour faire gagner du temps au plus vifs d&#8217;entre vous :</p>
<pre>
function addAttribute($context, $tag, $attribute, $value)
{
	$initialEncoding = mb_detect_encoding($context);
	if( $initialEncoding != 'UTF-8' ){
		$context = utf8_encode($context);
	}

	$doc = new DOMDocument("4.01", "utf-8");

	$contentPrefix = '&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;required meta for utf-8 handling!&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;/head&gt;&lt;body&gt;';
	$contentSuffix = '&lt;/body&gt;&lt;/html&gt;';

	$doc->loadHTML($contentPrefix . $context . $contentSuffix);

	$elements = $doc->getElementsByTagName($tag);

	if(!is_array($value)){
		$value = array($value);
	}

	foreach($elements as $element)
	{

		foreach($value as $currentValue)
		{
			$alreadySet = false;

			if($element->hasAttribute($attribute))
			{

				$attributeCurrentValue = $element->getAttribute($attribute);

				$attributeCurrentValues = explode(' ', $attributeCurrentValue);

				foreach( $attributeCurrentValues as $attributeCurrentValue )
				{
					if($attributeCurrentValue == $currentValue){
						$alreadySet = true;
					}
				}
				if(!$alreadySet){
					$element->setAttribute($attribute, implode(' ', $attributeCurrentValues) . ' ' . $currentValue);
				}
			} else {
				$element->setAttribute($attribute, $currentValue);
			}
		}
	}

	$output = mb_substr($doc->saveHTML(), 236, -16);

	if( $initialEncoding != 'UTF-8' ){
		mb_convert_encoding($output, $initialEncoding, 'UTF-8');
	}

	return $output;
}
</pre>
<h3>Explications</h3>
<pre>
$initialEncoding = mb_detect_encoding($context);
	if( $initialEncoding != 'UTF-8' ){
		$context = utf8_encode($context);
	}
</pre>
<p>On commence par détecter le format d&#8217;encodage actuellement utilisé dans le contexte fourni.<br />
On le stocke pour pouvoir retourner la version modifiée dans le même format, et on le converti en UTF-8.<br />
Pourquoi UTF-8 ? Ce format a l&#8217;avantage (énorme) de gérer tous les caractères, y compris les caractères accentués ou spéciaux de différents langages.</p>
<pre>
	$doc = new DOMDocument("4.01", "utf-8");
</pre>
<p>On crée ensuite un nouvel objet DOM, au constructeur duquel on passe deux paramètres : la version du document que l&#8217;on va utiliser (typiquement &laquo;&nbsp;1.0&#8243; pour du XML et &laquo;&nbsp;4.01&#8243; pour du HTML), et le jeu de caractères de ce document (charset).</p>
<pre>
	$contentPrefix = '&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;required meta for utf-8 handling!&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;/head&gt;&lt;body&gt;';
	$contentSuffix = '&lt;/body&gt;&lt;/html&gt;';

	$doc->loadHTML($contentPrefix . $context . $contentSuffix);
</pre>
<p>On va ensuite ajouter un header au contexte passé. En effet, même si on a défini les valeurs <em>attendues</em> pour le document fourni, celles-ci seront effacées par le document si ces headers ne sont pas fournis. Et je peux vous assurer que lorsqu&#8217;on ne sait pas ça, il y a de quoi s&#8217;arracher les cheveux !! C&#8217;est sans doute le point le plus vicieux de la manipulation.<br />
On peut ensuite charger le contenu dans cet objet DOM.</p>
<pre>
	if(!is_array($value)){
		$value = array($value);
	}
</pre>
<p>Cette fonction prévoit de pouvoir ajouter plusieurs valeurs à un attribut donné. Si l&#8217;argument passé à la fonction est une chaine de caractères, on la transforme donc en tableau.</p>
<p>Je ne m&#8217;attarderai pas sur le reste de la fonction en elle même, qui est assez explicite.<br />
Notez simplement que l&#8217;on préserve les valeurs déjà existantes en les stockant dans un tableau, et que l&#8217;on vérifie avant d&#8217;ajouter la valeur de l&#8217;attribut si elle n&#8217;existe pas déjà.</p>
<pre>
	$output = mb_substr($doc->saveHTML(), 236, -16);
</pre>
<p>On va ensuite sauvegarder le résultat obtenu, et retirer les préfixe et suffixe que l&#8217;on avait ajouté grâce à une fonction gérant les caractères multibytes. En effet, un substr classique ne fonctionnerait pas convenablement avec certains caractères, puisque l&#8217;on est ici en UTF-8 qui utilise plusieurs octets pour stocker certains d&#8217;entre eux.</p>
<pre>
	if( $initialEncoding != 'UTF-8' ){
		mb_convert_encoding($output, $initialEncoding, 'UTF-8');
	}

	return $output;
</pre>
<p>Il est temps de remettre le résultat obtenu dans son jeu de caractère d&#8217;origine et de retourner le résultat.</p>
<p>Et&#8230; Voila! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ré-écriture d&#8217;URL et SEO</title>
		<link>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 21:39:26 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[ré-écriture d'url]]></category>
		<category><![CDATA[url-rewriting]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=82</guid>
		<description><![CDATA[Vous avez décidé d&#8217;utiliser la ré-écriture d&#8217;url pour rendre vos URL plus lisibles et &#8216;amicales&#8217; pour l&#8217;utilisateur. C&#8217;est probablement une bonne chose, étant donné que les moteurs de recherche eux aussi les préfèrent ainsi. Mais attention, il y a certains écueils à éviter !
En effet, avec ce type de configuration, on ne fait plus bien [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez décidé d&#8217;utiliser la ré-écriture d&#8217;url pour rendre vos URL plus lisibles et &#8216;amicales&#8217; pour l&#8217;utilisateur. C&#8217;est probablement une bonne chose, étant donné que les moteurs de recherche eux aussi les préfèrent ainsi. Mais attention, il y a certains écueils à éviter !</p>
<p>En effet, avec ce type de configuration, on ne fait plus bien la distinction entre contenu et répertoire&#8230; et les robots non plus! Du coup, http://www.mondomaine.com/example et http://www.mondomaine.com/example/ renvoient généralement sur le même contenu, mais sont vus comme deux pages différentes par les moteurs de recherche.</p>
<p>On a alors dilution du référencement, et les doublons sont de la partie. Quelle Horreur !</p>
<p>Nous avons déjà traité un problème similaire à propos des <a href="http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/">noms de domaines multiples</a> dans un précédent article. La solution sera ici du même ordre.</p>
<p>Pour éviter tout souci de doublon, il vous faudra vous assurer que les adresses sans slash de fin (comme http://www.mondomaine.com/example) renvoient sur la même adresse avec slash de fin (comme http://www.mondomaine.com/example/) avec une erreur 301 (page définitivement déplacée).</p>
<p>Pour ce faire, il s&#8217;agira de procéder comme dans l&#8217;exemple ci dessous, à l&#8217;aide d&#8217;un fichier .htaccess ou en modifiant la configuration du serveur web :</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_URI} !-d
	RewriteCond %{REQUEST_URI} !(.*)/$
	RewriteRule ^(.*)$ http://www.mondomaine.com/$1/ [L,R=301]
&lt;/IfModule&gt;</pre>
<ul>
<li>La première ligne annonce l&#8217;utilisation d&#8217;une règle de ré-écriture, et la seconde indique le répertoire courant comme racine.</li>
<li><em>RewriteCond %{REQUEST_FILENAME} !-f</em> exclut les fichiers existant de cette règle, afin qu&#8217;un slash ne leur soit pas adjoint.</li>
<li><em>RewriteCond %{REQUEST_FILENAME} !-d</em> fait de même avec les répertoires existant réellement sur le site.</li>
<li><em>RewriteCond %{REQUEST_URI} !(.*)/$</em> s&#8217;occupe d&#8217;exclure les URLs finissant déjà par un slash.</li>
<li>Enfin, <em>RewriteRule ^(.*)$ http://www.mondomaine.com/$1/ [L,R=301]</em> rajoute un slash à la fin des URL ainsi sélectionnées, en retournant en passant le code d&#8217;erreur approprié.</li>
</ul>
<p>Notez que vous devez placer thes règles avant celles pré-existantes pour être sûr d&#8217;avoir le comportement désiré.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multiples noms de domaines et SEO</title>
		<link>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 21:24:45 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[multiple sites]]></category>
		<category><![CDATA[redirection]]></category>
		<category><![CDATA[sites multiples]]></category>

		<guid isPermaLink="false">http://blog.lindicible.com/?p=60</guid>
		<description><![CDATA[Que faire lorsque l&#8217;on a plusieurs noms de domaines pointant sur un même site pour gérer au mieux son référencement ?
Que ce soit pour protéger les noms voisins (ex: monsite.com et mon-site.com) ou pour tirer parti des avantages des différents TLD (Top Level Domain) (ex: monsite.com et monsite.org), il y a parfois de bonnes raisons [...]]]></description>
			<content:encoded><![CDATA[<p>Que faire lorsque l&#8217;on a plusieurs noms de domaines pointant sur un même site pour gérer au mieux son référencement ?</p>
<p>Que ce soit pour protéger les noms voisins (ex: monsite.com et mon-site.com) ou pour tirer parti des avantages des différents <a rel="external" href="http://fr.wikipedia.org/wiki/Tld">TLD</a> (Top Level Domain) (ex: monsite.com et monsite.org), il y a parfois de bonnes raisons d&#8217;utiliser plusieurs noms de domaine pour un même site.</p>
<p>Si l&#8217;on y prend pas garde, les moteurs de recherche importants (liste exhaustive des moteurs de recherche importants:Google) peuvent considérer ces sites comme des doublons et/ou attribuer les pages à un domaine ou un autre de manière arbitraire, diluant vos résultats dans les <a rel="external" href="http://fr.wikipedia.org/wiki/Page_de_r%C3%A9sultats_d%27un_moteur_de_recherche">SERP</a> (Search Engine Result Pages). Dans tous les cas, la qualité de votre référencement en souffre.</p>
<p>Pour éviter ce problème, il nous faut choisir un nom de domaine principal qui servira de référence. Ceci implique l&#8217;utilisation de ce nom partout où l&#8217;on peut avoir besoin d&#8217;inscrire une URL, et la modification du comportement des domaines secondaires.</p>
<p>Nous allons faire en sorte que les domaines secondaires retournent le même contenu que le domaine principal, tout en prévenant les robots qu&#8217;ils ne sont pas le domaine principal. Encore une fois, les <a rel="external" href="http://www.google.com/support/webmasters/bin/answer.py?answer=40132&#038;hl=fr">codes d&#8217;erreur HTTP</a> vont nous être utiles : nous allons retourner un code 301 (changement d&#8217;adresse définitif) avec le contenu.</p>
<p>Notez qu&#8217;un code d&#8217;erreur 302 (changement d&#8217;adresse temporaire) serait beaucoup moins efficace pour ce que nous cherchons à réaliser&#8230; et c&#8217;est ce qui est envoyé par défaut lors d&#8217;une redirection !</p>
<p>Pour retourner ce code, il existe plusieurs méthodes. La plus simple est probablement l&#8217;utilisation de l&#8217;instruction &#8216;redirect&#8217; dans la configuration du serveur web (Apache) ou dans un fichier .htaccess à la racine du serveur.</p>
<p>Voici l&#8217;instruction à utiliser pour rediriger l&#8217;ensemble des requêtes vers l&#8217;adresse principale :</p>
<pre>Redirect 301 / http://monsite.com/</pre>
<p>ou</p>
<pre>Redirect permanent / http://monsite.com/</pre>
<p>Vous pouvez par exemple inclure un virtual hostname pour tous les domaines secondaires de la manière suivante :</p>
<pre>&lt;VirtualHost *:80&gt;
    ServerName www.monsite.org
    ServerAlias monsite.org
    ServerAlias www.mon-site.com
    ServerAlias mon-site.com
    &lt;IfModule mod_alias.c&gt;
        Redirect permanent / http://www.mon-site-principal.com/
    &lt;/IfModule&gt;
&lt;/VirtualHost&gt;</pre>
<p>Une autre façon de réaliser ceci sans modifier la conf d&#8217;apache serait d&#8217;appliquer des RewriteRules à travers un fichier .htaccess à la racine de votre site. Par exemple :</p>
<pre>RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)mon-site.com$
RewriteRule ^(.*)$ http://www.mon-site-principal.com/$1 [R=301,L]</pre>
<p>ou encore avec :</p>
<pre>RedirectMatch 301 /blog(.*) /$1</pre>
<p>Avec un code d&#8217;erreur bien géré, vous vous assurez que le nom de domaine principal bénéficie de tout son potentiel. Le moteurs de recherche importants sont contents, donc vous aussi !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>404 et SEO</title>
		<link>http://www.lindicible.com/blog/2008/10/29/404-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/10/29/404-et-seo/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 20:02:17 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[codes d'erreur]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=9</guid>
		<description><![CDATA[Lorsque l&#8217;on cherche à optimiser son site pour obtenir un meilleur référencement sur les moteurs de recherche, on tombe très vite dans le monde souterrain du SEO (Search Engine Optimization).
Il y a dans cet univers beaucoup de bon sens et quelques trucs à savoir, ainsi que certains concepts flirtant avec le sacré, comme le célèbre [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsque l&#8217;on cherche à optimiser son site pour obtenir un meilleur référencement sur les moteurs de recherche, on tombe très vite dans le monde souterrain du SEO (<a rel="external" href="http://fr.wikipedia.org/wiki/Search_engine_optimization">Search Engine Optimization</a>).</p>
<p>Il y a dans cet univers beaucoup de bon sens et quelques trucs à savoir, ainsi que certains concepts flirtant avec le sacré, comme le célèbre PageRank de Google.</p>
<p>D&#8217;une manière générale, il faut comprendre de quelle manière les robots utilisés par les référenceurs voient votre site, c&#8217;est à dire en texte uniquement. Vous pouvez en avoir un bon aperçu en utilisant un navigateur texte comme <a rel="external" href="http://home.pacific.net.sg/~kennethkwok/lynx/">lynx</a>.</p>
<p>Tout ce qui peut permettre d&#8217;aider le travail de ces robots est un avantage pour vous. Utiliser du code html validé par le <a rel="external" href="http://validator.w3.org">w3c</a> et des feuilles de style valides ne changera pas votre pagerank mais donnera une meilleure visibilité de la structure de votre site aux robots que si vous le formatiez en utilisant des tableaux ou des div partout.</p>
<p>La sémantique du code html permet aux robots de distinguer le type de contenu, et de les utiliser de manière pertinente.</p>
<p>Par exemple, le tag &lt;h1&gt; doit contenir des titres de premier niveau, le tag &lt;h2&gt; des titres secondaires, le tag &lt;p&gt; des paragraphes de texte, et ainsi de suite.</p>
<p>Le plus important est évidemment la balise &lt;title&gt; de vos pages, qui doit contenir autant que possible les mots-clefs les plus importants.</p>
<p>La spécificité des robots par rapport aux utilisateurs ne s&#8217;arrête pas là.</p>
<p>En même temps que le contenu des pages, des codes d&#8217;erreurs sont émis. Ces codes sont rarement visibles pour l&#8217;utilisateur, à part le fameux 404 (page indisponible), mais ils sont importants.</p>
<p>Pour référence, voici une <a rel="external" href="http://www.google.com/support/webmasters/bin/answer.py?answer=40132&#038;hl=fr">liste des codes d&#8217;erreur</a> que les serveurs web sont susceptibles de retourner.</p>
<p>Imaginons que vous ayez un contenu dynamique&#8230; Certaines pages peuvent disparaitre de votre site, bien que des liens externes pointent encore dessus.</p>
<p>Typiquement, nous voulons rediriger l&#8217;utilisateur vers une page proche de sa requête, plutôt que de le confronter à une page d&#8217;erreur qui risque de le bloquer. Mais nous voulons aussi prévenir les moteurs de recherche que ce lien est obsolète et qu&#8217;il faut le supprimer. Dites vous bien que lorsqu&#8217;un robot tombe trop souvent sur un 404 il n&#8217;apprécie guère et cela peut avoir des conséquences sur votre référencement !</p>
<p>Comment résout-on cela, me direz vous ? Tout simplement, en émettant le code d&#8217;erreur approprié, tout en affichant un contenu pour l&#8217;utilisateur !</p>
<p>Le code 404 est le plus connu, mais cette erreur indique juste que la page n&#8217;a pas pu être jointe, pour quelque erreur que ce soit. Pour une page volontairement désactivée, nous lui préférerons l&#8217;erreur 410 qui indique que la page n&#8217;est plus disponible de manière délibérée et non suite à un problème technique.</p>
<p>A vous de choisir quel <a rel="external" href="http://www.webrankinfo.com/outils/faq_8_61.htm">code d&#8217;erreur</a> vous semble le plus à même de refléter le statut de la page&#8230;</p>
<p>Pour générer le code d&#8217;erreur, il va falloir modifier le &#8216;header&#8217; de la page. Sous php, il s&#8217;agit d&#8217;utiliser la commande suivante :</p>
<pre>header('HTTP/1.0 410 Gone');</pre>
<p>Notez que le header est la toute première chose qui est émise lorsque la page est envoyée. Il doit donc être situé tout au tout début du document, avant même la déclaration du type de document (<a rel="external" href="http://fr.wikipedia.org/wiki/Document_Type_Definition">DTD</a>).</p>
<p>Pas très pratique lorsque la gestion du contenu est structurée de manière à dissocier les éléments fixes de la page (comme le logo ou le menu) du contenu réel. En effet, si le script affiche le haut de la page avant de traiter la requête relative au contenu et de s&#8217;apercevoir qu&#8217;il n&#8217;existe pas, il est trop tard pour modifier le header !</p>
<p>Un moyen simple de contourner ce problème est d&#8217;augmenter la taille du buffer php.</p>
<p>Dans php.ini, modifier la ligne output_buffering :</p>
<pre>output_buffering = 65535</pre>
<p>Cette valeur est une valeur limite, mais généralement suffisante (si vos pages ne pèsent pas un poids déraisonnable!)</p>
<p>Vous pouvez désormais retourner n&#8217;importe quel type d&#8217;erreur quand vous le souhaitez, sans perturber la visite de vos utilisateurs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/10/29/404-et-seo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
