Ces derniers mois Google a beaucoup communiqué sur Googlebot Evergreen et sa capacité renforcée à crawler et indexer correctement des sites dont le contenu est généré par du code javascript, et ceci même si cela se passe dans le navigateur.
Vous pourriez en conclure que Google sait crawler et indexer des contenus générés en Ajax ? Car après tout, il s’agit bien d’un cas particulier de contenus générés en javascript. Oui vous avez raison, mais Google ne le fait pas… mais alors, pas du tout.
Google sait effectivement crawler et indexer du contenu généré en Ajax. Mais il ne veut pas le faire… En tout cas, pas quand vous utilisez une syntaxe ajax dans vos urls.
Alors comment faire, si vous générez du contenu en Ajax, pour convaincre Google de crawler quand même votre magnifique contenu que vous appelez par des requêtes asynchrones ?
En utilisant des hash bangs dans l’url !
Pour que votre contenu en Ajax soit crawlé et indexé, il faut que les urls contiennent des #!
Des quoi ? Des « hash bangs » ?
Oui, il faut avoir des « #! » dans les urls.
Les américains appellent le caractère dièse « hash » et le point d’exclamation « bang ».
Les urls utilisées en ajax sont souvent de la forme :
https://www.example.com/mapage.html#var1=1&var2=34
Bref, on « détourne » l’usage normal du caractère # qui dans une url sert normalement à désigner qu’il faut que le navigateur affiche la page et positionne la fenêtre en se calant sur une ancre située dans la page.
Le problème, c’est que par défaut, les bots de moteurs de recherche ignorent totalement ce qui suit un # dans le processus de crawl et d’indexation. C’est logique car ils cherchent à indexer des pages, et non des morceaux de page.
C’est d’ailleurs parce que la notion de page est essentielle que Google ne veut pas indexer par défaut ce qui est généré en Ajax.
En effet, en ajax on peut mettre à jour :
- un élément isolé d’une page, comme par exemple l’indice du Cac 40 en quasi temps réel. Dans ce cas, moins de 1% d’une page est modifié, et Google ne veut pas indexer la page qui contient ce chiffre mis à jour constamment à chaque fois que l’indice est mis à jour. Ce qui générerait un nombre impressionnant de quasi doublons
- une part significative de la page
- ou une page entière ! Dans ce cas, et à condition que le contenu généré en ajax soit stable, Google pourrait trouver utile de pouvoir crawler et indexer ces contenus
Mais Google ne peut pas savoir dans quel cas on se situe AVANT d’avoir crawlé les contenus en ajax, et comme le cas le plus fréquent est plutôt le premier, Google ne cherche pas à crawler les contenus en Ajax. Il les ignore, à dessein.
Comment faire crawler mes contenus générés en Ajax ?
Mais si vous rajoutez un bang dans l’url derrière le hash, alors tout change : vous indiquez à Google qu’il y’a du contenu intéressant à indexer derrière ces urls, et Google exécutera votre code Javascript Ajax pour récupérer la nouvelle version de la page.
En clair si votre url ressemble à cela :
https://www.exemple.com/page.html#var1=1&var2=23
alors Google ignorera votre contenu.
et si votre url ressemble à ceci :
https://www.exemple.com/page.html#!var1=1&var2=23
alors Google va appeler ce contenu, et peut l’indexer s’il correspond à ses critères d’indexation.
Est-ce la meilleure des solutions pour faire crawler et indexer ses contenus en ajax ? Non il existe d’autres solutions, mais c’est la plus simple à mettre en oeuvre et elle est compatible avec la méthode des « escaped fragments » qui fonctionnait déjà avec des urls en #!. Cette méthode est déclarée obsolète depuis des années, mais les vieux sites qui continuent de l’utiliser restent crawlables compte tenu du fait que Google continue d’interpréter les urls avec #! comme une directive indiquant que les contenus associés doivent être crawlés par Googlebot.
Pour en savoir plus : une video de John Mueller sur le sujet (publiée en septembre 2019)
Bonjour,
Merci pour l’astuce mais je suis plutôt étonné : je fais passer les variables via ajax en utilisant un ? dans l’url, pas un # : https://www.exemple.com/page.html?var1=1&var2=23
Je viens d’ailleurs d’essayer de remplacer le ? par un # et les variables ne sont pas transmises…
J’ai raté quelque chose ?
Bonjour Stéphane,
Il faut remplacer le ? par #! et non pas utiliser # seul.
Avec #! (hashbang) le contenu transmis en AJAX peut-être indexé si aucun autre signal ne vient s’y opposer.
Bonne journée.