Résumé
Si votre site Discourse apparaît comme du HTML brut et non stylisé lorsque vous y accédez via un lien dans l’application Facebook sur iPhone — sans CSS, sans JavaScript, aucune fonctionnalité — la cause est la détection incorrecte du robot par Discourse, qui identifie à tort le navigateur intégré de Facebook comme un bot.
La solution consiste en une modification d’une seule ligne via la console Rails.
Le symptôme
Les utilisateurs qui cliquent sur des liens vers votre site Discourse depuis l’application Facebook sur iPhone voient une page HTML épurée et non stylisée — essentiellement la mise en page du crawler/noscript. Aucun JavaScript n’est exécuté, ce qui signifie que des fonctionnalités comme les grilles d’images, les lightboxes et les lecteurs multimédias ne fonctionnent pas. Les mêmes liens fonctionnent correctement dans Safari, Chrome, ainsi que dans le navigateur intégré de Facebook sur Android et iPad.
La cause
Le navigateur intégré de Facebook sur iPhone s’identifie avec une chaîne d’agent utilisateur contenant le mot facebook, par exemple :
Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15
(KHTML, like Gecko) Mobile/23D8133 Safari/604.1 MetaIAB Facebook
La détection du robot par Discourse (CrawlerDetection) compare les agents utilisateur au paramètre du site crawler_user_agents, dont la valeur par défaut inclut facebook :
rss|bot|spider|crawler|facebook|archive|wayback|ping|...
Cela amène Discourse à servir à l’agent utilisateur de Facebook la mise en page statique du robot au lieu de l’application Ember complète — même s’il s’agit d’un véritable navigateur utilisé par une vraie personne.
Vous pouvez confirmer que cela se produit en vérifiant votre journal d’accès nginx pour les requêtes provenant de ce navigateur et en notant que la taille de la charge de réponse est considérablement plus petite que d’habitude (généralement environ 5 Ko contre 35 Ko pour une page de sujet complète).
La solution
Ajoutez MetaIAB au paramètre du site crawler_check_bypass_agents. Ce paramètre est spécifiquement conçu pour exempter les agents utilisateur du traitement robot, même s’ils correspondent à la liste des robots.
Remarque : crawler_check_bypass_agents est un paramètre du site caché et n’apparaît pas dans l’interface d’administration standard. La console Rails est requise.
Via la console Rails
SiteSetting.crawler_check_bypass_agents = "MetaIAB"
Si le paramètre a déjà une valeur (par exemple cubot), ajoutez avec un séparateur pipe :
SiteSetting.crawler_check_bypass_agents = "cubot|MetaIAB"
Le changement prend effet immédiatement — aucun redémarrage n’est nécessaire.
Pourquoi cela fonctionne
La méthode CrawlerDetection.crawler? utilise trois paramètres en combinaison :
non_crawler_user_agents— si l’agent utilisateur correspond à cette liste, il pourrait être un vrai navigateurcrawler_user_agents— s’il correspond également à cette liste, il est traité comme un robotcrawler_check_bypass_agents— s’il correspond à cette liste, il est exempté du traitement robot, peu importe
L’agent utilisateur du navigateur intégré de Facebook contient Safari, qui correspond à non_crawler_user_agents. Il contient également facebook, qui correspond à crawler_user_agents. L’ajout de MetaIAB — une chaîne unique à l’agent utilisateur du navigateur intégré de Facebook — à crawler_check_bypass_agents amène Discourse à lui servir l’application complète.
Pourquoi Android et iPad ne sont pas affectés
- Android : Le navigateur intégré de Facebook sur Android envoie un agent utilisateur différent qui ne contient pas
facebook, il passe donc la détection du robot sans problème. - iPad : Le navigateur intégré de Facebook sur iPad déclenche également la mise en page du robot, mais comme l’iPad signale une largeur de fenêtre
window.innerWidthimportante (~1180px), Discourse sert la mise en page de bureau qui, par hasard, s’affiche correctement. La vue étroite de l’iPhone (~414px) déclenche la mise en page mobile, qui en mode robot est complètement non fonctionnelle.
Note supplémentaire : inondation par meta-webindexer
Séparément, l’indexeur web de Facebook (meta-webindexer/1.1) peut envoyer un volume très élevé de requêtes à votre site — potentiellement des milliers par heure — toutes ciblant la page d’accueil. Contrairement à meta-externalagent (qui gère les aperçus de liens OG et doit rester débloqué), meta-webindexer semble ne servir aucun objectif utile pour la plupart des installations Discourse.
Si vous observez ce trafic dans vos journaux, vous pouvez le bloquer au niveau nginx en l’ajoutant à votre configuration de blocage des bots :
"~*meta-webindexer" 1;
meta-externalagent doit rester autorisé, car il est responsable de l’extraction des métadonnées OG lorsque des liens sont partagés sur Facebook.