Une sitemap pour MiddleMan avec Builder

Le protocole sitemap est un protocole initialement défini par Google en 2005, et adopté depuis par les autres grands moteurs de recherche comme Bing (et donc Yahoo!), Baidu ou Yandex. Comme vous le savez, ces moteurs de recherche utilisent des crawlers pour parcourir, analyser et référencer les pages web. L'objectif de la sitemap est de leur faciliter le travail en leur fournissant un cliché de la structure de votre site, voire certaines métadonnées à associer à chaque page.

Attention, soyons clairs : avoir une sitemap ne garantit pas que votre site sera indexé : il s'agit juste d'indications qui aideront le crawler à parcourir votre site le cas échéant. Il est en revanche clairement indiqué par Google qu'une sitemap xml ne peut pas influencer négativement votre référencement : ce serait donc dommage de s'en priver.

Les caractéristiques d'une sitemap

Format

Le format le plus répandu pour générer des sitemaps est le XML (il est possible d'utiliser des sitemaps au format RSS ou texte simple, mais je n'évoquerai pas cela dans cet article). Voyons donc comment s'agence un sitemap.xml :

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://example.com/</loc>
        <lastmod>2014-01-01</lastmod>
        <changefreq>weekly</changefreq>
        <priority>0.8</priority>
    </url>
</urlset>
Balise Description
<urlset> [Obligatoire] Encapsule la liste des URL.
<url> [Obligatoire] Chaque <url> va contenir une page et ses métadonnées.
<loc> [Obligatoire] L'URL de la page, préfixée par le protocole (http).
<lastmod> La date de dernière modification du fichier, au format Datetime du W3C.
<changefreq> La fréquence à laquelle la page est modifiée. Les valeurs possibles sont : always / hourly / daily / weekly / monthly / yearly / never. Attention, cette valeur est indicative, et il n'est pas certain que les crawlers la respecteront à la lettre.
<priority> La priorité de cette page par rapport aux autres pages du site, entre 0.0 et 1.0. La priorité par défaut est de 0.5. Il s'agit d'une priorité relative : il ne sert donc à rien d'indiquer une priorité maximale à toutes vos pages.

Contraintes

Un fichier sitemap ne doit pas contenir plus de 50.000 URL et ne doit pas peser plus de 10Mo. À noter qu'il est possible de gzipper votre sitemap pour gagner en poids, si besoin. Si vous disposez de plus de 50.000 URL à indexer, vous pouvez utiliser plusieurs sitemaps, auquel cas vous devrez créer une sitemap "maître" qui référencera toutes les autres. Pour la suite de cet article, on va supposer que vous êtes dans le cas simple d'une sitemap unique de moins de 50.000 pages.

Sitemap : la générer avec Builder

Builder est une gem qui facilite la génération de fichiers XML. Si vous utilisez la gem middleman-blogging (c'est sans doute le cas si vous avez suivi mes précédents articles sur MiddleMan), Builder est d'ores et déjà utilisé pour générer le flux RSS de votre blog. Vous pouvez en profiter jeter un œil au fichier source/feed.xml.builder : nous allons créer le même genre de choses, mais adapté au format sitemap.

Un premier sitemap.xml.builder

Je crée donc un fichier source/sitemap.xml.builder dans lequel je vais décrire la façon de générer mon sitemap :

1
2
3
4
5
6
7
8
9
xml.instruct!
xml.urlset 'xmlns' => "http://www.sitemaps.org/schemas/sitemap/0.9" do
    sitemap.resources.select { |page| page.path =~ /\.html/ }.each do |page|
        xml.url do
            xml.loc "http://mon.domaine.com/#{page.destination_path}"
            xml.changefreq "weekly"
        end
    end
end

Avec ce premier jet, je vais obtenir une sitemap référençant uniquement mes fichiers .html, avec une fréquence de changement définie par défaut à weekly (c'est la fréquence moyenne à laquelle je publie de nouveaux articles sur ce blog).

Améliorer cette sitemap avec des priorités différentes

Je souhaite établir les priorités d'indexation suivantes :

  • Page d'index et posts : je veux voir ces pages indexées en priorité, et leur assigne donc la priorité 1.0,
  • Pages de tags et calendar : ces pages là me semblent moins primordiales (si l'index et les posts sont bien indexés, indexer ces pages ne m'apportera rien de plus).

Bon, avec un peu de Ruby, ça va être un jeu d'enfant :

1
2
3
4
5
6
7
8
9
10
xml.instruct!
xml.urlset 'xmlns' => "http://www.sitemaps.org/schemas/sitemap/0.9" do
    sitemap.resources.select { |page| page.path =~ /\.html/ }.each do |page|
        xml.url do
            xml.loc "http://mon.domaine.com/#{page.destination_path}"
            xml.changefreq "weekly"
            xml.priority page.data.sm_priority || "1.0"
        end
    end
end

Vous remarquez l'ajout de la ligne xml.priority page.data.sm_priority || "0.5". page.data regroupe les métadonnées associées à cette ressource (métadonnées définies dans le Front Matter, typiquement). Cette ligne signifie simplement que si le Front Matter de ma page n'a pas de donnée sm_priority, alors je lui attribue une priorité de 1.0.

Ne me reste plus qu'à modifier mes calendar.slim et tag.slim en ajoutant une ligne sm_priority: 0.5 dans le Front Matter, et nous avons donc une sitemap aux petits oignons, qui se mettra à jour automatiquement à chaque nouveau build de notre site !

Qu'est-ce que j'en fais, de cette sitemap ?

Maintenant que nous disposons de notre sitemap, nous pouvons la soumettre à un validateur pour vérifier qu'elle est bien conforme, puis la mettre à disposition des moteurs de recherche. Pour cela, nous avons plusieurs façons de procéder :

  1. Placer la sitemap à la racine du site, en faisant attention à ce que le fichier soit bien nommé sitemap.xml. S'il est nommé différemment, nous devons ajouter une entrée dans notre fichier robots.txt pour le référencer. Cette ligne doit se présenter ainsi : Sitemap: http://mon.domaine.com/carte-de-site.xml .
  2. Soumettre manuellement la sitemap via les outils webmaster de chaque moteur de recherche,
  3. Soumettre la sitemap aux moteurs de recherche avec une simple requête HTTP, en utilisant un outil comme wget ou curl. Attention, les caractères spéciaux doivent alors être encodés, ce qui, pour un fichier http://mon.domaine.com/sitemap.xml, nous donne donc une URL de la forme : <url_du_moteur>/ping?sitemap=http%3A%2F%2Fmon.domaine.com%2Fsitemap.xml. Si nous recevons une réponse au code HTTP 200, c'est que le moteur de recherche a bien reçu notre sitemap. Cette dernière méthode présente l'avantage de pouvoir être automatisée avec un outil de déploiement comme Capistrano ou l'excellent Mina.

Référence