Cache, bots et redirections 301
Bonjour,
j'ai un problème de code de retours HTTP erronés (200 au lieu de 301) sur des articles ayant subi une redirection suite à un changement d'url si le user agent de la requête est reconnu comme un bot.
En effet, la fonction cache_valide
sert explicitement du vieux cache aux bots: si le cache est invalide, on renvoie 1 mais par pour les bots pour lesquels on renverra 0 en fin de fonction
if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
// Cache invalide par la meta 'derniere_modif'
// sauf pour les bots, qui utilisent toujours le cache
if (
!_IS_BOT
and $GLOBALS['derniere_modif_invalide']
and isset($GLOBALS['meta']['derniere_modif'])
and $date < $GLOBALS['meta']['derniere_modif']
) {
return 1;
}
Pour reproduire
-
publication d'un article avec l’url
mon-article-faux
-
bot va lire l’article - on lui sert le cache calculé en 1 (vous pouvez utiliser
curl --insecure --head --user-agent "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/126.0.6478.126 Safari/537.36" "https://monsite.local/mon-article-faux" --location
-
l'auteur se rend compte d'une erreur et modifie le titre et l’url en
mon-titre-ok
-
bot va recrawler l’article sur
mon-article-faux
- on lui sert le cache obsolète calculé en 1: vieux titre erroné + code retour 200 <= c'est problématique, on aurait du renvoyer 301❌ -
internaute va lire l’article sur mon-article-faux
- on recalcule un cache neuf : code 301 + titre à jour avec url
mon-titre-ok`✅ -
bot va lire l’article sur
mon-article-faux
- on lui sert encore le cache calculé en 1 qui correspond à l’ancienne url… avec code retour 200❌ -
on supprime le cache obsolète (via xray par exemple)
-
bot va lire l’article sur
mon-article-faux
- redirection 301 sur le nouvel article✅
Correction
Bon là je suis embêté. Sur le principe, je comprend qu'on ne veuille pas recalculer de cache et remplir la queue des jobs pour des bots - donc on sert du vieux cache. Mais il faudrait pouvoir faire une exception pour les redirections!
Dans la fonction cache_valide
, on pourrait demander de recalculer le cache mais on n'a pas assez de contexte pour voir que ce sera une redirection => ça me semble compliqué d'agir ici.
Du coup, je me dis que le mieux serait de supprimer spécifiquement le cache obsolète:
- au moment de l'insertion de la nouvelle url
- ou quand l'internaute déclenche le calcul du nouveau cache, on pourrait virer les anciens
- ou... ?
Bref, j'en suis là de mes réflexions. Je suis preneur de vos avis éclairés
cpol0