Maîtriser les entêtes de Drupal 8 et son SEO

Une laverie automatique

Après avoir mis en ligne votre site Drupal 8, vous pourriez constater dans les journaux d'accès à votre site de nombreuses tentatives d'accès aux formulaires d'édition, d'ajout ou encore de suppression de vos contenus, qui échouent bien entendu sur un accès refusé. De belles erreurs 403.

Que diable ? Etes-vous la cible d'une attaque ciblée ?

Ou bien tout simplement, les moteurs de recherche cherchent-ils à accéder à ces pages généralement interdites aux visiteurs anonymes ?

Rassurez-vous, ce n'est pas une attaque en règle. Mais pourquoi les robots cherchent-ils à indexer vos formulaires d'édition, ou de suppression de contenus ?

Tout simplement, parce que les entêtes HTML contiennent par défaut tous les liens relatifs aux actions possibles sur un contenu. Par exemple vous devriez retrouver ce type de lien dans le HEAD de vos pages de contenus, ainsi que sur les pages des termes de taxonomy :

<link rel="canonical" href="/page/article-1" />
<link rel="shortlink" href="/node/1" />
<link rel="delete-form" href="/node/1/delete" />
<link rel="edit-form" href="/node/1/edit" />
<link rel="version-history" href="/node/1/revisions" />
<link rel="revision" href="/page/article-1" />

Certains de ces liens sont tout à fait légitimes, comme les balises canonical ou shortlink. Les autres sont sujettes à discussion.

Et comme toujours avec Drupal, quand il y a un souci ou une question, il y a toujours une issue.

La présence de ces liens n'est pas en soi un véritable problème, puisque seulement utilisés par les robots. A part peut-être de remplir joyeusement vos journaux d'accès d'erreurs 403.

Par contre, en matière de SEO, il n'est pas considéré comme une bonne pratique (et c'est un euphémisme) de proposer sur les pages d'un site internet des liens conduisant à des erreurs 404 ou 403, ou toute autre erreur. Et pendant que les robots cherchent à scanner toutes ces pages inaccessibles, c'est autant de temps en moins qu'ils passeront pour indexer vos pages de contenus. Si l'algorythme ne prévoit pas des mesures plus coercitives si trop d'erreurs sont rencontrées.

En attendant que l'issue sur ce sujet aboutisse, vous pouvez facilement modifier les balises méta ajoutées sur vos pages au moyen des hooks hook_page_attachments() et hook_page_attachments_alter().

Ce snippet devrait pouvoir les enlever rapidement.

/**
 * Implements hook_page_attachments_alter().
 */
function MYMODULE_page_attachments_alter(array &$attachments) {
  $html_head_link = $attachments['#attached']['html_head_link'];
  foreach ($html_head_link as $key => $value) {
    if (isset($value[0]['rel'])){
      switch ($value[0]['rel']) {
        case 'delete-form';
        case 'edit-form';
        case 'version-history';
        case 'revision';
          unset($attachments['#attached']['html_head_link'][$key]);
          break;
      }
    }
  }
}

Et il vous faudra vous assurer que votre module MYMODULE soit bien exécuté en dernier pour cette altération, au moyen de hook_module_implements_alter().

/**
 * Implements hook_module_implements_alter().
 */
function MYMODULE_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'page_attachments_alter') {
    $group = $implementations['MYMODULE'];
    unset($implementations['MYMODULE']);
    $implementations['MYMODULE'] = $group;
  }
}

Pour les pages des termes de taxonomy, ce snippet va remplir son office.

Mais pour les pages de contenu, vous aurez toujours ces balises méta dans le HEAD de votre page. Car elles sont ajoutées à un autre niveau.

Pour accéder à ces balises sur les pages de noeud, vous devrez implémenter hook_entity_view_alter().

/**
 * Implements hook_entity_view_alter().
 */
function MYMODULE_entity_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {

  if ($build['#view_mode'] == 'full' && $entity Instanceof NodeInterface) {
    if (!isset($build['#attached']['html_head_link'])) {
      return;
    }

    $html_head_link = $build['#attached']['html_head_link'];
    foreach ($html_head_link as $key => $value) {
      if (isset($value[0]['rel'])){
        switch ($value[0]['rel']) {
          case 'delete-form':
          case 'edit-form':
          case 'version-history':
          case 'revision':
            unset($build['#attached']['html_head_link'][$key]);
            break;
        }
      }
    }
  }
}

Désormais, vous avez le contôle total des balises méta ajoutées dans le HEAD de vos pages.

Vous pourrez aussi, avec ces quelques snippets, gérer plus finement l'indexation de vos pages, en complément de l'excellent module Metatag, comme par exemple les pages de recherche interne, pour améliorer votre référencement naturel et le SEO de votre site Drupal 8.

Et vous, vous personnalisez beaucoup les balises méta de vos pages ? N'hésitez pas à nous partager vos retours.

 

Commentaires

Soumis par Yann Weyer (non vérifié) le 04/03/2016 à 00:11 - Permalien

Hello,

Merci pour ton article, j'étais justement en train de me casser les dents sur ce point, à essayer de trouver quel hook permettait de supprimer ces balises, et je ne m'attendais pas à tomber sur une ressource en français.

Simple remarque, j'ai toujours entendu dire que le `switch` était très lourd en PHP, et qu'il valait mieux lui préférer un comparaison sur `in_array` ou sur `isset`. Cela donnerait le résultat suivant:
```
/**
* Implements hook_entity_view_alter().
*/
function MYMODULE_entity_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {

if ($build['#view_mode'] == 'full' && $entity Instanceof \Drupal\node\NodeInterface) {
if (!isset($build['#attached']['html_head_link'])) {
return;
}

$html_head_link = $build['#attached']['html_head_link'];
$keys_to_remove = ['delete-form', 'edit-form', 'version-history', 'revision'];

foreach ($html_head_link as $key => $value) {
if (isset($value[0]['rel']) && in_array($value[0]['rel'],$keys_to_remove)){
unset($build['#attached']['html_head_link'][$key]);
}
}
}
}
```
(idem pour les pages)

==> Qu'en penses-tu ?

Soumis par fabrice le 04/03/2016 à 09:39 - Permalien

Oui switch est moins performant sur des grands volumes à comparer, mais plus rapide parfois sur des petits volumes. Ici, je ne suis pas sûr cela fasse une grande différence sur un dizaine d'items à tester.

Ajouter un commentaire