Skip to content

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

  1. publication d'un article avec l’url mon-article-faux

  2. 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

  3. l'auteur se rend compte d'une erreur et modifie le titre et l’url en mon-titre-ok

  4. 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

  5. internaute va lire l’article sur mon-article-faux- on recalcule un cache neuf : code 301 + titre à jour avec urlmon-titre-ok`

  6. 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

  7. on supprime le cache obsolète (via xray par exemple)

  8. 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