Fermer

juin 19, 2018

Une liste de contrôle en 8 points pour le débogage de problèmes de SEO techniques étranges


Parfois, un problème se pose sur votre bureau, un peu hors de l'ordinaire. Quelque chose où vous n'avez pas une réponse facile. Vous allez à votre cerveau et votre cerveau ne retourne rien.

Ces problèmes ne peuvent pas être résolus avec un peu de recherche de mot-clé et de configuration technique de base. Ce sont les types de problèmes techniques SEO où le trou de lapin va profondément.

La nature même de ces situations défie une liste de contrôle, mais il est utile d'en avoir une pour la même raison que nous les avons dans les avions: même les meilleurs d'entre nous peuvent et vont oublier des choses, et une liste de vérification


Envie d'exemples de problèmes de SEO étranges? Voici quatre exemples à réfléchir pendant que vous lisez. Nous y répondrons à la fin.

1. Pourquoi Google n'a-t-il pas affiché un balisage 5 étoiles sur les pages de produits?

  • Les pages comportaient un balisage de produit rendu par un serveur et un balisage de produits Feefo, y compris des évaluations en pièce jointe côté client.
  • L'extrait de notes Feefo a été rendu avec succès dans Fetch & Render, plus l'outil adapté aux mobiles.
  • Lorsque vous avez placé le DOM rendu dans l'outil de test de données structurées, les deux parties de données structurées sont apparues sans erreur.

2. Pourquoi Bing ne présenterait-il pas de balisage 5 étoiles sur les pages de révision, alors que Google le ferait?

  • Les pages de commentaires des clients et des concurrents avaient toutes des notes détaillées sur Google.
  • Tous les concurrents avaient noté des extraits enrichis sur Bing; Cependant, le client n'a pas.
  • Les pages d'évaluation validaient correctement le schéma d'évaluation sur l'outil de test de données structurées de Google, mais pas sur Bing.

3. Pourquoi les pages ont-elles été indexées avec une balise sans index?

  • Les pages avec une balise No-Index rendue côté serveur ont été indexées par Google sur un grand modèle pour un client.

4. Pourquoi une page sur un site Web a-t-elle renvoyé 302 environ 20-50% du temps, mais uniquement pour les robots d'exploration?

  • Un site Web a généré 302 erreurs de façon aléatoire
  • Ceci n'est jamais arrivé dans le navigateur. 19659007] L'agent d'utilisateur n'a fait aucune différence; l'emplacement ou les cookies ne faisaient également aucune différence.

Enfin, une note rapide. Il est tout à fait possible qu'une partie de cette liste de contrôle ne s'applique pas à tous les scénarios. C'est totalement bien. Il est censé être un processus pour tout ce que vous pourriez vérifier, pas tout ce que vous devriez vérifier.

La vérification de la liste de contrôle

Est-ce vraiment important? ce problème n'affecte qu'une infime quantité de trafic? Est-ce seulement sur une poignée de pages et vous avez déjà une grande liste d'autres actions qui aideront le site Web? Vous avez probablement besoin de le laisser tomber.

Je sais, je déteste ça aussi. Je veux aussi avoir raison et creuser ces choses. Mais dans six mois, quand vous avez résolu vingt trous de lapin SEO complexes et votre site Web est resté à plat parce que vous n'avez pas réécrire les balises de titre, vous allez toujours être viré.

Mais j'espère que ce n'est pas le cas, auquel cas, à partir de maintenant!

Où voyez-vous le problème?

Nous ne voulons pas perdre beaucoup de temps. Avez-vous entendu cette merveilleuse phrase?: "Si vous entendez des sabots, ce n'est probablement pas un zèbre."

Le processus que nous sommes sur le point de suivre est assez complexe et c'est entièrement à votre discrétion si vous voulez aller de l'avant. Assurez-vous juste que vous ne négligez pas quelque chose d'évident qui résoudrait votre problème. Voici quelques problèmes courants que j'ai rencontrés qui étaient principalement des chevaux.

  1. Vous êtes sous-performant d'où vous devriez être.
    1. Quand un site est sous-performant, les gens aiment chercher des excuses. Weird Bizarre Google peut être une chose très utile à blâmer. En réalité, c'est généralement une combinaison d'un site médiocre, d'une concurrence accrue et d'une marque défaillante. Cheval.
  2. Vous avez subi une chute de trafic soudaine.
    1. Quelque chose est certainement arrivé, mais ce n'est probablement pas la liste de contrôle pour vous. Il y a beaucoup de listes de contrôle de bon sens pour cela. J'ai écrit au sujet de diagnostiquant des pertes de trafic récemment – vérifiez cela en premier.
  3. La mauvaise page fait le classement de la mauvaise requête
    1. D'après mon expérience (qui devrait probablement précéder tout le post), il s'agit généralement d'un problème de base lorsqu'un site a un mauvais ciblage ou beaucoup de cannibalisation. Probablement un cheval.

Facteurs qui rendent plus probable que vous avez un problème plus complexe qui vous oblige à mettre vos chaussures de débogage:

  • Un site Web qui a beaucoup de JavaScript côté client.
  • Des sites plus anciens et plus anciens avec plus d'héritage
  • Votre problème est lié à une nouvelle propriété ou fonctionnalité de Google où la connaissance de la communauté est moindre. 1. Commencez par choisir quelques exemples de pages.

    Choisissez quelques pages d'exemple avec lesquelles travailler – celles qui présentent le problème que vous rencontrez. Non, ce ne sera pas représentatif, mais nous y reviendrons un peu.

    Bien sûr, si cela ne concerne qu'un nombre infime de pages, cela peut être représentatif, auquel cas nous sommes bons. Cela compte vraiment, non? Vous n'avez pas simplement passé l'étape ci-dessus? OK, cool, passons à autre chose.

    2. Google peut-il explorer la page une fois?

    Nous vérifions d'abord si Googlebot a accès à la page, que nous définirons comme un code d'état 200.

    Nous allons vérifier de quatre manières différentes pour exposer les problèmes courants:

    1. Robots.txt: Ouvrez la Search Console et archivez le validateur robots.txt
    2. Agent d'utilisateur: Ouvrez Dev Tools et vérifiez que vous pouvez ouvrir l'URL avec Googlebot et Googlebot Mobile
      1. Pour obtenir le sélecteur d'agent utilisateur, ouvrez Dev Tools
      2. Vérifiez que le tiroir de la console est ouvert (la touche Escape est la touche Escape)
      3. Appuyez sur … et ouvrez "Conditions réseau"
      4. agent d'utilisateur!

    1. Adresse IP: Vérifiez que vous pouvez accéder à la page avec l'outil de test mobile . (Cela viendra de l'un des IP utilisés par Google, les contrôles que vous faites de votre ordinateur ne sera pas.)
    2. Pays: L'outil de test mobile va visiter à partir de IP des États-Unis, de ce que je vu, donc nous obtenons deux oiseaux avec une pierre. Mais Googlebot explorera occasionnellement des adresses IP non-américaines, il est donc utile d'utiliser un VPN pour vérifier si vous pouvez accéder au site à partir d'autres pays concernés.
      1. J'ai utilisé HideMyAss pour cela avant, mais peu importe le VPN que vous avez, ça marchera très bien.

    Nous devrions maintenant savoir si Googlebot a du mal à aller chercher la page une fois.

    Avons-nous déjà trouvé des problèmes?

    Si nous pouvons recréer une crawl ayant échoué avec une simple vérification ci-dessus, il est probable que Googlebot échoue systématiquement à récupérer notre page et c'est généralement une de ces raisons fondamentales.

    Mais ce n'est peut-être pas le cas. De nombreux problèmes sont incompatibles en raison de la nature de la technologie. 😉

    3. Dites-nous à Google deux choses différentes?

    Suivant: Google peut trouver la page, mais la confondons-nous en lui disant deux choses différentes?

    C'est le plus souvent vu, d'après mon expérience, parce que quelqu'un a bousillé les directives d'indexation.

    Par "directives d'indexation", je fais référence à toute balise qui définit le statut d'index correct ou la page dans l'index qui doit être classée. Voici une liste non exhaustive:

    • No-index
    • Canonical
    • Balises de remplacement du mobile
    • Balises de remplacement AMP

    Un exemple de fourniture de messages mixtes serait:

    • Non-indexation page A
    • Page B canoniques à la page A

    Ou:

    • La page A a un canonique dans un en-tête à A avec un paramètre
    • La ​​page A a un canonique dans le corps à A sans paramètre

    Si nous fournissons des messages contradictoires, nous ne savons pas comment Google va répondre. C'est une excellente façon de commencer à voir des résultats étranges.

    Les bons endroits pour vérifier les directives d'indexation énumérées ci-dessus sont:

    • Plan du site
      • Exemple: Les balises alternatives mobiles peuvent être placées dans un sitemap
    • en-têtes HTTP
      • Exemple: Les robots canoniques et méta peuvent être définis dans les en-têtes.
    • Tête de HTML
      • C'est ici que vous cherchez probablement, vous aurez besoin de celui-ci pour faire une comparaison.
    • Directives générées par JavaScript et codées en dur
      • Il se peut que vous définissiez une chose dans la source de la page et en restituiez une autre avec JavaScript, c'est-à-dire que vous voyiez quelque chose de différent dans la source HTML du DOM rendu.
    • Paramètres de la Console de recherche Google
      • Il existe des paramètres de la Search Console pour ignorer les paramètres et la localisation du pays qui peuvent entrer en conflit avec les balises d'indexation de la page.

    Un peu de marge sur le rendu DOM

    Cette page contient beaucoup de mentions 18, si vous êtes curieux). Puisque nous venons d'avoir notre premier, voici un bref récapitulatif de ce que c'est.

    Lorsque vous chargez une page Web, la première requête est le code HTML. C'est ce que vous voyez dans la source HTML (cliquez avec le bouton droit sur une page Web et cliquez sur Afficher la source).

    C'est avant que JavaScript n'ait fait quoi que ce soit sur la page. Cela ne servait pas à être un gros problème, mais maintenant beaucoup de sites Web s'appuient fortement sur JavaScript que le plus grand nombre de personnes ne feront pas confiance au HTML initial.

    DOM rendu est le terme technique pour une page, lorsque tout le JavaScript a été rendu et que toutes les modifications de page ont été faites. Vous pouvez le voir dans Dev Tools.

    Dans Chrome, vous pouvez obtenir cela en cliquant avec le bouton droit de la souris et en appuyant sur l'élément d'inspection (ou Ctrl + Shift + I). L'onglet Elements affichera le DOM tel qu'il est rendu. Quand il arrête de scintiller et de changer, alors vous avez le DOM rendu!

    4. Google peut-il explorer la page régulièrement?

    Pour voir ce que Google voit, nous allons avoir besoin de fichiers journaux. À ce stade, nous pouvons vérifier pour voir comment il accède à la page.

    A côté de: Travailler avec des logs est un article entier en soi. J'ai écrit un guide pour l'analyse du journal avec BigQuery je vous recommande également d'essayer Screaming Frog Log Analyzer qui a fait un excellent travail de gestion de la complexité autour des bûches.

    Quand on regarde l'exploration, il y a trois vérifications utiles que nous pouvons faire:

    1. Codes d'état: Tracer les codes d'état au fil du temps. Google voit-il des codes de statut différents de ceux que vous lisez lorsque vous vérifiez des URL?
    2. Ressources: Google télécharge-t-il toutes les ressources de la page?
      1. Télécharge-t-il tous les fichiers JavaScript et CSS spécifiques à votre site dont il aurait besoin pour générer la page?
    3. Suivi de la taille d'une page: Prenez le maximum et le minimum de toutes vos pages et ressources et comparez-les. Si vous constatez une différence, Google risque de ne pas télécharger toutes les ressources ou toutes les pages. (Astuce Hat à @ohgm où j'ai d'abord entendu cette astuce)

    Avons-nous déjà trouvé des problèmes?

    Si Google ne reçoit pas systématiquement les 200s dans nos fichiers journaux, mais nous peut accéder à la page bien quand nous essayons, alors il y a clairement encore quelques différences entre Googlebot et nous-mêmes. Quelles pourraient être ces différences?

    1. Il va ramper plus que nous
    2. C'est évidemment un bot, plutôt qu'un humain prétendant être un bot
    3. Il va ramper à différents moments de la journée

    Cela signifie que:

    • Si notre site Web fait un blocage de bot intelligent, il pourrait être en mesure de faire la différence entre nous et Googlebot.
    • Parce que Googlebot va mettre plus de stress sur nos serveurs web, il pourrait se comporter différemment. Lorsque les sites Web ont beaucoup de robots ou de visiteurs en même temps, ils peuvent prendre certaines mesures pour aider à garder le site en ligne. Ils peuvent activer plus d'ordinateurs pour alimenter le site Web (cela s'appelle la mise à l'échelle), ils peuvent également tenter de limiter les utilisateurs qui demandent beaucoup de pages ou servir des versions réduites de pages.
    • Les serveurs exécutent des tâches périodiquement; par exemple, un site Web d'annonces pourrait exécuter une tâche quotidienne à 01h00 pour nettoyer toutes ses vieilles listes, ce qui pourrait affecter les performances du serveur.

    Travailler sur ce qui se passe avec ces effets périodiques va être difficile; vous allez probablement avoir besoin de parler à un développeur back-end.

    Selon votre niveau de compétence, vous pourriez ne pas savoir exactement où mener la discussion. Une structure utile pour une discussion est souvent de parler de la façon dont une demande passe à travers votre pile technologique et ensuite de regarder les cas de bord dont nous avons discuté ci-dessus.

    • Qu'arrive-t-il aux serveurs sous forte charge?
    • Quand des tâches planifiées importantes se produisent-elles?

    Deux éléments d'information utiles pour entrer dans cette conversation avec:

    1. Selon la régularité du problème dans les journaux, il est souvent utile d'essayer de recréer le problème en essayant d'explorer le site Web avec un robot à la même vitesse / intensité que Google utilise pour voir si vous pouvez trouver / causer les mêmes problèmes. Ce ne sera pas toujours possible en fonction de la taille du site, mais pour certains sites il le sera. Être capable de recréer régulièrement un problème est la meilleure façon de le résoudre.
    2. Si vous ne pouvez pas, cependant, essayez de fournir les périodes exactes où Googlebot a vu les problèmes. Cela donnera au développeur la meilleure chance d'attacher le problème à d'autres journaux pour les laisser déboguer ce qui se passe.

    Si Google peut explorer la page de manière cohérente, alors nous passons à l'étape suivante.

    5. Est-ce que Google voit ce que je peux voir de façon ponctuelle?

    Nous savons que Google rampe la page correctement. La prochaine étape consiste à essayer de déterminer ce que Google voit sur la page. Si vous avez un site Web lourd en JavaScript, vous vous êtes probablement déjà attaqué à ce problème, mais même si vous ne le faites pas, cela peut parfois poser problème.

    Nous suivons le même schéma qu'avant. D'abord, nous essayons de le recréer une fois. Les outils suivants nous permettront de faire cela:

    • Fetch et rendu
      • Affiche: DOM rendu dans une image, mais ne renvoie que le code HTML de la source à lire.
    • Test pour mobile
      • Affiche: DOM rendu et renvoie le DOM rendu pour que vous puissiez le lire
      • Non seulement cela montre que vous avez rendu le DOM, mais il va aussi suivre toutes les erreurs de la console.

    Existe-t-il une différence entre Fetch & Render, l'outil de test adapté aux mobiles et Googlebot? Pas vraiment, à l'exception des délais d'attente (c'est pourquoi nous avons nos dernières étapes!). Voici la analyse complète de la différence entre eux, si cela vous intéresse.

    Une fois que nous avons la sortie de ceux-ci, nous les comparons à ce que nous voyons habituellement dans notre navigateur. Je recommande d'utiliser un outil comme Diff Checker pour comparer les deux.

    Avons-nous déjà trouvé des problèmes?

    Si nous rencontrons des différences significatives à ce stade, alors, selon mon expérience, il s'agit généralement de JavaScript ou de cookies

    Pourquoi?

    Nous pouvons isoler chacun d'entre eux par:

    • Chargement de la page sans cookies. Cela peut être fait simplement en chargeant la page avec une nouvelle session incognito et en comparant le DOM rendu ici avec le DOM rendu dans notre navigateur ordinaire.
    • Utilisez l'outil de test mobile pour voir la page avec Chrome 41 et comparez avec le DOM rendu que nous voyons normalement avec Inspect Element.

    Encore une fois, nous pouvons les comparer en utilisant quelque chose comme Diff Checker qui nous permettra de voir les différences. Vous pouvez utiliser un formateur HTML pour mieux les aligner.

    Nous pouvons également voir les erreurs JavaScript lancées à l'aide de l'outil de test adapté aux mobiles, ce qui peut s'avérer particulièrement utile si vous avez confiance en votre JavaScript.

    Si, en utilisant ces connaissances et ces outils, nous pouvons recréer le bogue, alors nous avons quelque chose qui peut être répliqué et il est plus facile pour nous de transmettre à un développeur un bogue qui sera corrigé.

    Si nous voyons que tout est correct ici, nous passons à l'étape suivante.

    6. Qu'est-ce que Google voit réellement?

    Il est possible que ce que Google voit est différent de ce que nous recréons en utilisant les outils de l'étape précédente. Pourquoi? Quelques raisons principales:

    • Les serveurs surchargés peuvent avoir toutes sortes de comportements étranges. Par exemple, ils peuvent renvoyer 200 codes, mais peut-être avec une page par défaut.
    • JavaScript est rendu séparément des pages explorées et Googlebot peut passer moins de temps à traduire JavaScript qu'un outil de test.
    • Il y a souvent beaucoup de mise en cache dans la création de pages Web et cela peut causer des problèmes.

    Nous sommes arrivés aussi loin sans parler de temps! Les pages ne sont pas explorées instantanément et les pages explorées ne sont pas indexées instantanément.

    Barre latérale rapide: Qu'est-ce que la mise en cache?

    La mise en cache est souvent un problème si vous arrivez à cette étape. Contrairement à JS, on n'en parle pas autant dans notre communauté, donc ça vaut la peine d'avoir plus d'explications au cas où vous ne seriez pas familier. La mise en cache consiste à stocker quelque chose, de sorte qu'il est disponible plus rapidement la prochaine fois.

    Lorsque vous demandez une page Web, il se produit beaucoup de calculs pour générer cette page. Si vous actualisiez la page lorsque cela était fait, il serait incroyablement inutile de relancer tous ces calculs. Au lieu de cela, les serveurs sauvegardent souvent la sortie et vous servent la sortie sans les réexécuter. L'enregistrement de la sortie s'appelle la mise en cache.

    Pourquoi avons-nous besoin de le savoir? Eh bien, nous sommes déjà bien dans les mauvaises herbes à ce stade et il est donc possible qu'un cache est mal configuré et les mauvaises informations sont renvoyées aux utilisateurs.

    Il n'y a pas beaucoup de bonnes ressources de débutant sur la mise en cache qui vont plus loin. Cependant, j'ai trouvé que cet article sur les bases de la mise en cache était l'un des plus amicaux. Il couvre assez bien certains types de base de la mise en cache.

    Comment pouvons-nous voir avec quoi Google travaille réellement?

    • Cache de Google
      • Spectacles: Code source
      • Bien que cela ne vous montrera pas le DOM rendu, il vous montre le code HTML brut que Googlebot a réellement vu en visitant la page. Vous devrez vérifier ceci avec JS désactivé; sinon, en l'ouvrant, votre navigateur exécutera tous les JS sur la version en cache.
    • Le site recherche un contenu spécifique
      • Spectacles: Un petit extrait de contenu rendu.
      • En cherchant une phrase spécifique sur une page, p. inurl: example.com/url "uniquement JS rendu texte" vous pouvez voir si Google a réussi à indexer un extrait spécifique de contenu. Bien sûr, cela ne fonctionne que pour du texte visible et manque beaucoup de contenu, mais c'est mieux que rien!
      • Mieux encore, faites la même chose avec un tracker de rang, pour voir si ça change avec le temps.
    • Stockage du DOM rendu réel
      • Spectacles: DOM rendu
      • Alex de DeepCrawl a écrit à propos de sauvant le DOM rendu de Googlebot . La version TL; DR: Google rendra JS et post aux points de terminaison, afin que nous puissions l'obtenir pour soumettre la version rendue par JS d'une page qu'il voit. Nous pouvons alors sauvegarder cela, l'examiner et voir ce qui s'est mal passé.

    Avons-nous déjà trouvé des problèmes?

    Encore une fois, une fois que nous avons trouvé le problème, il est temps d'aller voir un développeur. Le conseil pour cette conversation est identique au dernier – tout ce que j'ai dit là s'applique toujours.

    L'autre connaissance que vous devriez entrer dans cette conversation armée de: comment Google fonctionne et où il peut lutter. Bien que votre développeur connaisse les tenants et les aboutissants techniques de votre site Web et la manière dont il est conçu, il se peut qu'il ne connaisse pas grand-chose sur le fonctionnement de Google. Ensemble, cela peut vous aider à atteindre la réponse plus rapidement.

    La source évidente pour cela sont des ressources ou des présentations données par Google eux-mêmes. Parmi les diverses ressources qui ont été publiées, j'ai trouvé que ces deux sources étaient parmi les plus utiles pour donner un aperçu des premiers principes:

    Mais il y a souvent une différence entre les déclarations que Google fera et ce que la communauté SEO voit dans la pratique. Toutes les expériences SEO effectuées sans relâche dans notre industrie peuvent également aider à jeter un peu de perspicacité. Il y a beaucoup trop de liste ici, mais voici deux bons exemples:

    7. Est-ce que Google pourrait agréger votre site Web par rapport à d'autres?

    Si nous avons atteint ce point, nous sommes très heureux que notre site fonctionne correctement. Mais tous les problèmes ne peuvent pas être résolus uniquement sur votre site Web; parfois vous devez regarder le paysage plus large et les SERPs autour d'elle.

    Le plus souvent, ce que je cherche ici est:

    • Contenu similaire / dupliqué sur les pages présentant le problème.
      • Il peut s'agir de contenu dupliqué intentionnel (par exemple le contenu de la syndication) ou non intentionnel (sites de raclage des concurrents ou indexés accidentellement).

    De toute façon, ils sont presque toujours trouvés en effectuant des recherches exactes dans Google. C'est à dire. prendre un morceau de contenu relativement spécifique de votre page et la chercher entre guillemets.

    Avez-vous déjà trouvé des problèmes?

    Si vous trouvez un certain nombre d'autres copies exactes, il est possible qu'elles aient causé des problèmes.

    La meilleure description que j'ai trouvée pour "Avez-vous trouvé un problème ici?" Est la suivante: pensez-vous que Google regroupe des pages similaires et n'en montre qu'une seule? Et si c'est le cas, choisit-elle la mauvaise page?

    Cela ne doit pas seulement être sur la recherche Google traditionnelle. Vous pourriez en trouver une version sur Google Jobs, Google Actualités, etc.

    Pour donner un exemple, si vous êtes un revendeur, vous pourriez trouver que le contenu ne se classe pas parce qu'il y a un autre revendeur plus fiable qui publie toujours les mêmes annonces en premier.

    Parfois, vous verrez cela de façon cohérente et directe, tandis que d'autres fois l'agrégation pourrait changer avec le temps. Dans ce cas, vous aurez besoin d'un tracker de rang pour la propriété de Google sur laquelle vous travaillez pour le voir.

    Jon Earnshaw de Pi Datametrics a donné un excellent discours sur ce dernier (autour d'un flux SERP suspect) qui mérite d'être regardé.

    Une fois que vous avez trouvé le problème, vous aurez probablement besoin d'expérimenter pour savoir comment le contourner, mais les facteurs les plus faciles à utiliser sont généralement:

    • Déduplication de contenu
    • Vitesse de découverte (vous pouvez souvent améliorer en mettant en place un flux RSS de 24 heures de tout le nouveau contenu qui apparaît)
    • Abaissement de la syndication

    8. Un tour d'horizon de quelques autres suspects probables

    Si vous êtes arrivé si loin, alors nous sommes sûrs que:

    • Google peut constamment explorer nos pages comme prévu.
    • Nous envoyons à Google des signaux cohérents sur l'état de notre page.
    • Google affiche constamment nos pages comme prévu.
    • Google sélectionne le bon page sur les doublons qui pourraient exister sur le web.

    Et votre problème n'est toujours pas résolu?

    Et c'est c'est important?

    Eh bien, tire.

    N'hésitez pas à nous embaucher …?

    Autant que j'aimerais que cet article énumère tous les problèmes de SEO, ce n'est pas vraiment pratique, donc pour finir cet article passons par deux trucs plus communs et des principes qui ne correspondaient pas vraiment ailleurs avant le réponses à ces quatre problèmes que nous avons énumérés au début.

    HTML incorrect / mal construit

    Vous et Googlebot pourriez voir le même HTML, mais il pourrait être invalide ou incorrect. Googlebot (et tout crawler, d'ailleurs) doit fournir des solutions de contournement lorsque la spécification HTML n'est pas suivie, et celles-ci peuvent parfois provoquer un comportement étrange.

    Le moyen le plus simple de le repérer est soit de regarder les outils DOM rendus ou d'utiliser un validateur HTML .

    Le validateur du W3C est très utile, mais il vous donnera beaucoup d'erreurs / avertissements dont vous n'aurez pas besoin. Le plus proche que je peux donner à une ligne de résumé de celles qui sont utiles est de:

    • Rechercher les erreurs
    • Ignorer tout ce qui a trait aux attributs (ne s'applique pas toujours, mais est souvent vrai).

    L'exemple classique de ceci est se casser la tête .

    Une iframe n'est pas autorisée dans le code de tête, donc Chrome terminera la tête et commencera le corps. Malheureusement, il prend le titre et canonique avec, parce qu'ils tombent après cela – donc Google ne peut pas les lire. Le code tête aurait dû se terminer à un endroit différent.

    Oliver Mason a écrit un bon article qui explique une version encore plus subtile de ceci se brisant la tête tranquillement .

    En cas de doute, diff

    Ne jamais sous-estimer le pouvoir d'essayer de comparer deux choses ligne par ligne avec un diff de quelque chose comme Diff Checker . Cela ne s'appliquera pas à tout, mais quand c'est le cas, c'est puissant.

    Par exemple, si Google a soudainement cessé d'afficher votre balisage en vedette, essayez de comparer votre page à une version historique, soit dans votre environnement de contrôle qualité, soit à partir de la Wayback Machine .


    Réponses à nos 4 questions originales

    Il est temps de répondre à ces questions. Ce sont tous des problèmes que nous avons rencontrés chez Distilled.

    1. Pourquoi Google n'a-t-il pas affiché un balisage 5 étoiles sur les pages de produits?

    Google voyait à la fois le balisage rendu par le serveur et le balisage rendu côté client; cependant, le côté rendu par le serveur a pris le dessus.

    La suppression du balisage rendu par le serveur signifiait que le balisage 5 étoiles commençait à apparaître.

    2. Pourquoi Bing n'indiquerait pas un balisage 5 étoiles sur les pages de révision, alors que Google le ferait?

    Le problème venait des références à schema.org.

            

    Avatar

    Réalisateur: James Cameron (né le 16 août 1954)

    Science Fiction

    Bande Annonce

Nous avons comparé notre balisage à nos concurrents et la seule différence était nous d a référencé la version HTTPS de schema.org dans notre itemtype, ce qui a empêché Bing de le prendre en charge.

Allez, Bing.

3. Pourquoi les pages ont-elles été indexées avec un tag sans index?

La réponse à cette question était dans ce post. C'était un cas de rupture de la tête.

Les développeurs avaient installé un ad-tech dans la tête et inséré une étiquette non-standard, c'est-à-dire pas:

  • </li><li><style></li> <li> <base> </li> <li> <link> </li> <li> <meta> </li> <li> <script></li> <li> <noscript> </li> </ul> <p> Cela a causé la tête à fin prématurément et l'étiquette sans index a été laissé dans le corps où il n'a pas été lu. </p> <p> <strong> 4. Pourquoi une page sur un site Web a-t-elle renvoyé 302 environ 20 à 50% du temps, mais uniquement pour les robots d'exploration?<br /> </strong> </p> <p> Cela a pris du temps à comprendre. Le client avait un ancien site web qui a deux serveurs, un pour le blog et un pour le reste du site. Ce problème est apparu peu après la migration du blog d'un sous-domaine (blog.client.com) vers un sous-répertoire (client.com/blog/...). </p> <p> Au niveau de la surface, tout allait bien; Si un utilisateur demandait une page individuelle, tout semblait bien. Une analyse de toutes les URL de blog pour vérifier qu'elles avaient été redirigées était correcte. </p> <p> Mais nous avons remarqué une forte augmentation des erreurs signalées dans la Search Console, et lors d'une analyse de routine à l'échelle du site, de nombreuses pages qui étaient correctes lors d'une vérification manuelle provoquaient des boucles de redirection. </p> <p> Nous avons vérifié en utilisant Fetch et Render, mais encore une fois, les pages étaient bien. </p> <p> Finalement, il s'est avéré que lorsqu'une page non-blog était demandée très rapidement après une page de blog (qui, de façon réaliste, est assez rapide pour réaliser), la demande pour la page de non-blog serait envoyée au serveur de blog. </p> <p> Ceux-ci seraient alors interceptés par une règle de redirection oubliée depuis longtemps, qui redirigeait les messages de blog supprimés (ou d'autres adresses URL) à la racine. Ceci, à son tour, a été attrapé par une règle de redirection HTTP à HTTPS 301, qui serait à nouveau demandée au serveur de blog, perpétuant la boucle. </p> <p> Par exemple, demander <a href="https://www.client.com/blog/"> https://www.client.com/blog/ </a> suivi assez rapidement par <a href="https://www.client.co"> https://www.client.co </a> m / category / aboutirait dans: </p> <ul> <li> 302 à <a href="http://www.client.com"> http://www.client.com </a> - C'était la règle qui redirigeait les messages de blog supprimés à la racine </li> <li> 301 à <a href="https://www.client.co"> https://www.client.co </a> m - Ce fut la couverture HTTPS rediriger </li> <li> 302 à <a href="http://www.client.com"> http://www.client.com </a> - Le serveur de blog ne connaît pas la page d'accueil HTTPS non-blog et il redirige à la version HTTP. Rincez et répétez. </li> </ul> <p> Cela a causé les erreurs 302 périodiques et cela signifiait que nous pouvions travailler avec leurs développeurs pour résoudre le problème. </p> <h2> Quels sont les meilleurs casse-tête que vous avez eu? </h2> <p> Écoutons-les, les gens. Quels problèmes avez-vous rencontrés? <a href="https://moz.com/blog/checklist-strange-technical-seo-problems#comments"> Faites-le-nous savoir dans les commentaires </a>. </p> <p> Mentionnons également <a href="https://twitter.com/RobinLord8" target="_blank"> @ RobinLord8 </a><a href="https://twitter.com/TomAnthonySEO" target="_blank"> @TomAnthonySEO </a><a href="https://twitter.com/THCapper" target="_blank"> @THCapper </a><a href="https://twitter.com/samnemzer" target="_blank"> @ samnemzer </a>et <a href="https://twitter.com/sergeystefoglo_" target="_blank"> @sergeystefoglo_ </a> pour de l'aide sur cette pièce.<br /> <br /><div class="clearfix button-collection container text-center "></div> <div class="clearfix button-collection container text-center "></div> <div class="clearfix button-collection container text-center "><a id="layers-widget-layers-pro-call-to-action-3-buttons-554" class="button " href="https://arcoptimizer.com/botinstagram?utm_source=bottom_article_blog&utm_medium=cta&utm_campaign=corporate_estimation"> Le meilleur outil 2023 pour ta croissance Instagram ! </a></div> <div class="clearfix text-center "> <button class="circle-action-btn"> <div class="circle-action-btn__icon"><i class="ion-speedometer"></i></div> </button> </div> <br> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2247171909266990" data-ad-slot="5039287111"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script><br /> <br /><a href="http://tracking.feedpress.it/link/9375/9495403">Source link </a></p> <div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon sd-sharing"><h3 class="sd-title">Partager :</h3><div class="sd-content"><ul><li class="share-twitter"><a rel="nofollow noopener noreferrer" data-shared="sharing-twitter-5512" class="share-twitter sd-button share-icon no-text" href="https://blog.arcoptimizer.com/une-liste-de-controle-en-8-points-pour-le-debogage-de-problemes-de-seo-techniques-etranges?share=twitter" target="_blank" title="Cliquez pour partager sur Twitter" ><span></span><span class="sharing-screen-reader-text">Cliquez pour partager sur Twitter(ouvre dans une nouvelle fenêtre)</span></a></li><li class="share-facebook"><a rel="nofollow noopener noreferrer" data-shared="sharing-facebook-5512" class="share-facebook sd-button share-icon no-text" href="https://blog.arcoptimizer.com/une-liste-de-controle-en-8-points-pour-le-debogage-de-problemes-de-seo-techniques-etranges?share=facebook" target="_blank" title="Cliquez pour partager sur Facebook" ><span></span><span class="sharing-screen-reader-text">Cliquez pour partager sur Facebook(ouvre dans une nouvelle fenêtre)</span></a></li><li class="share-end"></li></ul></div></div></div></p> <div id='jp-relatedposts' class='jp-relatedposts' > <h3 class="jp-relatedposts-headline"><em>Articles similaires</em></h3> </div> </div> <footer class="meta-info"><p><span class="meta-item meta-date"><i class="l-clock-o"></i> juin 19, 2018</span> <span class="meta-item meta-tags"><i class="l-tags"></i> <a href="https://blog.arcoptimizer.com/tag/controle" title="View all posts tagged contrôle">contrôle</a>, <a href="https://blog.arcoptimizer.com/tag/debogage" title="View all posts tagged débogage">débogage</a>, <a href="https://blog.arcoptimizer.com/tag/etranges" title="View all posts tagged étranges">étranges</a>, <a href="https://blog.arcoptimizer.com/tag/liste" title="View all posts tagged liste">liste</a>, <a href="https://blog.arcoptimizer.com/tag/points" title="View all posts tagged points">points</a>, <a href="https://blog.arcoptimizer.com/tag/problemes" title="View all posts tagged problèmes">problèmes</a></span></p></footer> </article> </div> </div> <div id="back-to-top"> <a href="#top">Revenir vers le haut</a> </div> <!-- back-to-top --> </section> <footer id="footer" class="footer-site invert"> <div class="container content clearfix"> <div class="row copyright"> <div class="column span-6"> <p class="site-text">Copyright arcoptimizer.com <script>document.write(new Date().getFullYear())</script> article@arcoptimizer.com</p> </div> <div class="column span-6 clearfix t-right"> <nav class="nav nav-horizontal pull-right"><ul id="menu-menu_footer" class="menu"><li id="menu-item-142202" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-142202"><a href="mailto:article@arcoptimizer.com"><i class='fa fa-envelope'></i></a></li> <li id="menu-item-142203" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-142203"><a href="http://article@arcoptimizer.com">article@arcoptimizer.com</a></li> </ul></nav> </div> </div> </div> </footer><!-- END / FOOTER --> <div class="search-interface-overlay"> <form role="search" method="get" class="search-interface-holder" action="https://blog.arcoptimizer.com/"> <label class="search-text"> Search: </label> <input type="text" id="layers-modal-search-field" class="search-field" placeholder="Type Something" value="" name="s" title="Search for:" autocomplete="off" autocapitalize="off" > </form> <a href="#" class="search-close"> <i class="l-close"></i> </a> </div> </section><!-- END / MAIN SITE #wrapper --> <style type="text/css"> @media (max-width: 480px) { .ednpro_main_wrapper{display:none; } }</style><div class="ednpro_main_wrapper ednpro_section"><div class="edn-close-section" id="apex_cookie_0" ><div class="edn-notify-bar edn-position-bottom edn-visibility-show-time edn-custom-template edn_no_close_button" id="edn_custom_template" data-barid="apexbar-0" data-postid="5512"> <input type="hidden" id='effect_type0' value="edn_pro_static"/> <input type="hidden" class='edn_social_optons' value="0"/> <input type="hidden" class='edn_right_optons' value="1"/><div class="edn-container apexnb-bartypeedn_pro_static"><style type="text/css">.edn-notify-bar .edn-custom-design-wrapper .ticker-wrapper .ticker, .edn-notify-bar .ticker-wrapper .ticker{ font-family: default; font-size: 22px; background-color: #1e73be; } /*added custom css*/ .edn-custom-template[data-barid=apexbar-0] .edn-custom-design-wrapper, .edn-custom-template[data-barid=apexbar-0], .edn-custom-template[data-barid=apexbar-0] .edn-contact-lightbox .edn-contact-lightbox-inner-wrap, .edn-custom-template[data-barid=apexbar-0] .edn-contact-close, .edn-custom-template[data-barid=apexbar-0] .edn-contact-lightbox-inner-wrap{ font-family: default; font-size: 22px; background-color: #1e73be; } .edn-custom-template[data-barid=apexbar-0] .edn-contact-lightbox-inner-wrap label{ } .edn-custom-template[data-barid=apexbar-0] .edn-mulitple-text-content, .edn-custom-template[data-barid=apexbar-0] .edn_static_text, .slider_template_wrapper .edn-tweet-content, .edn-post-title-wrap .edn-post-title li, .edn-custom-template[data-barid=apexbar-0] .edn_static_text, .slider_template_wrapper .edn-tweet-content, .edn-post-title-wrap .edn-post-title li, .edn-custom-template[data-barid=apexbar-0] .edn-tweet-content, .edn-custom-template[data-barid=apexbar-0] .edn-tweet-content a, .edn-custom-template[data-barid=apexbar-0] .ticker-content, .edn-custom-template[data-barid=apexbar-0] a, .edn-custom-template[data-barid=apexbar-0] .ticker-wrapper .ticker-content a, .edn-custom-template[data-barid=apexbar-0] .ticker-wrapper .ticker-content .edn-tweet-content, .edn-custom-template[data-barid=apexbar-0] .ticker-wrapper .edn-mulitple-text-content{ font-family: default; font-size: 22px; } .edn-custom-template[data-barid=apexbar-0] .edn-contact-form-wrap .edn-contact-close{ background-color: #1e73be; } /*tweets*/ .edn-custom-template[data-barid=apexbar-0] .ticker-wrapper .edn-post-title-readmore{ font-family: default; font-size: 22px; } /*ticker custom design start*/ .edn-custom-template[data-barid=apexbar-0] .ticker-wrapper .ticker-content a{ margin-left: 8px; } .edn-custom-template[data-barid=apexbar-0] .ticker_pattern .edn-ticker-wrapper .ticker-wrapper .ticker-swipe{ background-color: #1e73be; } /*ticker custom design end*/ .edn-custom-template[data-barid=apexbar-0] .edn-contact-close,input[type="button"].edn-contact-submit{ background-color: #1e73be; } .edn-custom-template[data-barid=apexbar-0] a.edn-controls-close,input[type="button"].edn-contact-submit{ color: #000000; } .edn-custom-template[data-barid=apexbar-0] .edn-social-heading-title{ font-size: 22px; } /*Custom Subscribe Form CSS ADDED*/ .edn-custom-template[data-barid=apexbar-0] h1, .edn-custom-template[data-barid=apexbar-0] h2, .edn-custom-template[data-barid=apexbar-0] h3, .edn-custom-template[data-barid=apexbar-0] h4, .edn-custom-template[data-barid=apexbar-0] h5, .edn-custom-template[data-barid=apexbar-0] h6, .edn-custom-template[data-barid=apexbar-0] .edn-subscribe-form .edn-front-title h3{ font-size: 22px; } .edn-custom-template[data-barid=apexbar-0] .edn-subscribe-form .edn-front-title h3 span{ } .edn-custom-template[data-barid=apexbar-0] .edn-subscribe-form .edn-front-title .show_icon i{ } /*Constant Contact Subscribe Form CSS END*/ /* For all CUstom buttons start */ .edn-custom-template[data-barid=apexbar-0] .edn-form-field .constant_subscribe, .edn-custom-template[data-barid=apexbar-0] .edn-subscribe-form .edn-form-field .edn_subs_submit_ajax, .edn-custom-template[data-barid=apexbar-0] .edn-custom-contact-link, .edn-custom-template[data-barid=apexbar-0] .edn-temp1-static-button, .edn-custom-template[data-barid=apexbar-0] .apexnb-search-layout1 .apex-search-right-section .btn-search-now, .edn-custom-template[data-barid=apexbar-0] .edn_static_text .edn-call-action-button a, .edn-custom-template[data-barid=apexbar-0] .edn-call-action-button a, .edn-custom-template[data-barid=apexbar-0] .edn-contact-lightbox .edn-form-field .edn-field input.edn-contact-submit{ background: #eeee22; color: #000000; font-family: default; } .edn-custom-template[data-barid=apexbar-0] .edn_static_text .edn-call-action-button a:hover, .edn-custom-template.edn-notify-bar .edn-custom-contact-link:hover, .edn-custom-template[data-barid=apexbar-0] .apexnb-search-layout1 .apex-search-right-section .btn-search-now:hover, .edn-custom-template[data-barid=apexbar-0] .edn-subscribe-form .edn-form-field .edn_subs_submit_ajax:hover, .edn-custom-template[data-barid=apexbar-0] .edn-form-field .edn_mailchimp_submit_ajax:hover, .edn-custom-template[data-barid=apexbar-0] .edn-form-field .constant_subscribe:hover { color: #ffffff; background: #81d742; } .edn-custom-template[data-barid=apexbar-0] .edn_static_text .edn-text-link a, .edn-custom-template[data-barid=apexbar-0] .edn_multiple_text .edn-mulitple-text-content a, edn-custom-template[data-barid=apexbar-0] .edn-multiple-content .edn-mulitple-text-content a, .edn-custom-template[data-barid=apexbar-0] .edn-post-title-wrap .edn-post-title li a{ color: #000000; background: ; } /* close button custom css */ .edn-custom-template[data-barid=apexbar-0] .edn-top-up-arrow.open, .edn-custom-template[data-barid=apexbar-0] .edn-bottom-down-arrow.open, .edn-custom-template[data-barid=apexbar-0] .edn-bottom-down-arrow.open, .edn-custom-template[data-barid=apexbar-0] .edn-left-arrow, .edn-custom-template[data-barid=apexbar-0] .edn-right-arrow, .edn-custom-template[data-barid=apexbar-0] .edn-cntrol-wrap.ednpro_user-can-close { background-image: url("../../images/showhidetoggledown.png") no-repeat scroll 0 0; } .edn-custom-template[data-barid=apexbar-0] .edn-cntrol-wrap.ednpro_user-can-close .fa-close{ } .edn-custom-template[data-barid=apexbar-0] .edn-top-up-arrow { background-image: url("../../images/showhidetoggletop.png") no-repeat scroll 0 0; border-radius: 14px; } .edn-custom-template[data-barid=apexbar-0] .edn-bottom-down-arrow{ border-radius: 14px; background-image: url("../../images/showhidetoggledown.png") no-repeat scroll 0 0; } /* close button custom css */ .edn-custom-template[data-barid=apexbar-0] .edn_error,.edn-error, .edn-constant-error .edn-custom-template[data-barid=apexbar-0] .edn-success, .edn-constant-success{ font-family: default; } /*social icons custom design start*/ .edn-custom-template[data-barid=apexbar-0] .edn-post-title-wrap .edn-post-title li{ } .edn-custom-template[data-barid=apexbar-0].edn-visibility-show-time{ display: none; } .edn-custom-template[data-barid=apexbar-0] .visibility_show-time{ display: none; } .edn-notify-bar .edn-custom-design-wrapper .edn-post-title-readmore{ color: #000000 !important; background: #eeee22 !important; padding: 2px 8px; font-size: 35px !important; font-weight: bolder !important; } .edn-notify-bar .edn-custom-design-wrapper .edn-post-title-readmore:hover{ color: #ffffff !important; background: #81d742 !important; }</style><div class="edn-temp-design-wrapper edn-custom-design-wrapper"><div class="edn_middle_content edn_pro_static_pattern"><div class="edn-text-content-wrap"><div class="edn_static_text"><div class="edn-text-link">L’Outil Surpuissant pour Exploser ton Chiffre d'Affaires en 2024 !</div> <span class="edn-call-action-button"> <span class="edn-ca-custom"> <a class="edn-static-button" href="https://allleads.arcoptimizer.com/fr" target='_blank'> <span class="edn-ca-static-button">Essai Gratuit Aujourd'hui</span> </a> </span> </span></div></div></div></div></div> <input type="hidden" class="edn-ticker-option" id="apexnb-ticker-0" data-ticker-speed="" data-ticker-direction="vertical" data-ticker-title="" data-ticker-hover="" data-slider-controls="" data-slider-animation="horizontal" data-slider-duration="" data-slider-auto="true" data-slider-transition="" data-slider-adaptive-height="true" data-scroll-controls="" data-scroll-direction="ltr" data-scroll-animation="reveal" data-scroll-speed="" data-scroll-title="" /> <input type="hidden" class="edn-visibility-bar-options edn-visibility-option-0" id="apexnb-0" data-show-time-duration="200" data-hide-time-duration="" data-visibility-type = "show-time" data-close-type = "disable" data-close-once = "" data-duration-close = "" data-show_once_hideshow = "" data-notification_bar_id = "0" /><div class="apexnb-ccform edn-template-3 edn-popup-form" data-formtype="apexnb-static-custom" data-barid="0"><div class="edn-contact-lightbox" id="edn-static-cf-btn-0-lightbox" style="display: none;"><div class="ednpro_overlay"></div><div class="edn-contact-lightbox-inner-wrap " id="edn-contact-lightbox-inner-wrap-0"><div class="edn-contact-lightbox-inner-content edn-contact-lightbox-inner-wrap apexnb-ccustomform-wrapper "></div></div></div></div></div></div></div><script defer src="data:text/javascript;base64,PGFtcC1hdXRvLWFkcyB0eXBlPSJhZHNlbnNlIgogICAgICAgIGRhdGEtYWQtY2xpZW50PSJjYS1wdWItMjI0NzE3MTkwOTI2Njk5MCI+CjwvYW1wLWF1dG8tYWRzPg=="></script> <script defer src="data:text/javascript;base64,CgkJd2luZG93LldQQ09NX3NoYXJpbmdfY291bnRzID0geyJodHRwczpcL1wvYmxvZy5hcmNvcHRpbWl6ZXIuY29tXC91bmUtbGlzdGUtZGUtY29udHJvbGUtZW4tOC1wb2ludHMtcG91ci1sZS1kZWJvZ2FnZS1kZS1wcm9ibGVtZXMtZGUtc2VvLXRlY2huaXF1ZXMtZXRyYW5nZXMiOjU1MTJ9OwoJ"></script> <link rel='stylesheet' id='aal_style-css' href='https://blog.arcoptimizer.com/wp-content/cache/autoptimize/css/autoptimize_single_4c15efd49114c121de9d8db67a23db93.css' type='text/css' media='all' /> <script defer type='text/javascript' src='https://blog.arcoptimizer.com/wp-content/cache/autoptimize/js/autoptimize_single_328b8123661abdd5f4a0c695e7aa9dcc.js?minify=false&ver=132249e245926ae3e188' id='jetpack-photon-js'></script> <script defer type='text/javascript' src='https://blog.arcoptimizer.com/wp-content/themes/defaut_theme3/assets/js/wow.min.js' id='layers-child-wow-js'></script> <script defer type='text/javascript' src='https://stats.wp.com/e-202418.js' id='jetpack-stats-js'></script> <script type='text/javascript' id='jetpack-stats-js-after'>_stq = window._stq || []; _stq.push([ "view", {v:'ext',blog:'146388461',post:'5512',tz:'0',srv:'blog.arcoptimizer.com',j:'1:12.8.1'} ]); _stq.push([ "clickTrackerInit", "146388461", "5512" ]);</script> <script defer type='text/javascript' src='https://blog.arcoptimizer.com/wp-content/cache/autoptimize/js/autoptimize_single_f4c0e5d883b22cceae0e8fbf05d26b3c.js' id='quads-ads-js'></script> <script defer id="sharing-js-js-extra" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgc2hhcmluZ19qc19vcHRpb25zID0geyJsYW5nIjoiZW4iLCJjb3VudHMiOiIxIiwiaXNfc3RhdHNfYWN0aXZlIjoiMSJ9OwovKiBdXT4gKi8K"></script> <script defer type='text/javascript' src='https://blog.arcoptimizer.com/wp-content/plugins/jetpack/_inc/build/sharedaddy/sharing.min.js' id='sharing-js-js'></script> <script defer id="sharing-js-js-after" src="data:text/javascript;base64,CnZhciB3aW5kb3dPcGVuOwoJCQkoIGZ1bmN0aW9uICgpIHsKCQkJCWZ1bmN0aW9uIG1hdGNoZXMoIGVsLCBzZWwgKSB7CgkJCQkJcmV0dXJuICEhICgKCQkJCQkJZWwubWF0Y2hlcyAmJiBlbC5tYXRjaGVzKCBzZWwgKSB8fAoJCQkJCQllbC5tc01hdGNoZXNTZWxlY3RvciAmJiBlbC5tc01hdGNoZXNTZWxlY3Rvciggc2VsICkKCQkJCQkpOwoJCQkJfQoKCQkJCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBldmVudCApIHsKCQkJCQlpZiAoICEgZXZlbnQudGFyZ2V0ICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQl2YXIgZWw7CgkJCQkJaWYgKCBtYXRjaGVzKCBldmVudC50YXJnZXQsICdhLnNoYXJlLXR3aXR0ZXInICkgKSB7CgkJCQkJCWVsID0gZXZlbnQudGFyZ2V0OwoJCQkJCX0gZWxzZSBpZiAoIGV2ZW50LnRhcmdldC5wYXJlbnROb2RlICYmIG1hdGNoZXMoIGV2ZW50LnRhcmdldC5wYXJlbnROb2RlLCAnYS5zaGFyZS10d2l0dGVyJyApICkgewoJCQkJCQllbCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJaWYgKCBlbCApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJCQkJCS8vIElmIHRoZXJlJ3MgYW5vdGhlciBzaGFyaW5nIHdpbmRvdyBvcGVuLCBjbG9zZSBpdC4KCQkJCQkJaWYgKCB0eXBlb2Ygd2luZG93T3BlbiAhPT0gJ3VuZGVmaW5lZCcgKSB7CgkJCQkJCQl3aW5kb3dPcGVuLmNsb3NlKCk7CgkJCQkJCX0KCQkJCQkJd2luZG93T3BlbiA9IHdpbmRvdy5vcGVuKCBlbC5nZXRBdHRyaWJ1dGUoICdocmVmJyApLCAnd3Bjb210d2l0dGVyJywgJ21lbnViYXI9MSxyZXNpemFibGU9MSx3aWR0aD02MDAsaGVpZ2h0PTM1MCcgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0gKTsKCQkJfSApKCk7CnZhciB3aW5kb3dPcGVuOwoJCQkoIGZ1bmN0aW9uICgpIHsKCQkJCWZ1bmN0aW9uIG1hdGNoZXMoIGVsLCBzZWwgKSB7CgkJCQkJcmV0dXJuICEhICgKCQkJCQkJZWwubWF0Y2hlcyAmJiBlbC5tYXRjaGVzKCBzZWwgKSB8fAoJCQkJCQllbC5tc01hdGNoZXNTZWxlY3RvciAmJiBlbC5tc01hdGNoZXNTZWxlY3Rvciggc2VsICkKCQkJCQkpOwoJCQkJfQoKCQkJCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBldmVudCApIHsKCQkJCQlpZiAoICEgZXZlbnQudGFyZ2V0ICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQl2YXIgZWw7CgkJCQkJaWYgKCBtYXRjaGVzKCBldmVudC50YXJnZXQsICdhLnNoYXJlLWZhY2Vib29rJyApICkgewoJCQkJCQllbCA9IGV2ZW50LnRhcmdldDsKCQkJCQl9IGVsc2UgaWYgKCBldmVudC50YXJnZXQucGFyZW50Tm9kZSAmJiBtYXRjaGVzKCBldmVudC50YXJnZXQucGFyZW50Tm9kZSwgJ2Euc2hhcmUtZmFjZWJvb2snICkgKSB7CgkJCQkJCWVsID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJCQkJfQoKCQkJCQlpZiAoIGVsICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCQkJLy8gSWYgdGhlcmUncyBhbm90aGVyIHNoYXJpbmcgd2luZG93IG9wZW4sIGNsb3NlIGl0LgoJCQkJCQlpZiAoIHR5cGVvZiB3aW5kb3dPcGVuICE9PSAndW5kZWZpbmVkJyApIHsKCQkJCQkJCXdpbmRvd09wZW4uY2xvc2UoKTsKCQkJCQkJfQoJCQkJCQl3aW5kb3dPcGVuID0gd2luZG93Lm9wZW4oIGVsLmdldEF0dHJpYnV0ZSggJ2hyZWYnICksICd3cGNvbWZhY2Vib29rJywgJ21lbnViYXI9MSxyZXNpemFibGU9MSx3aWR0aD02MDAsaGVpZ2h0PTQwMCcgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0gKTsKCQkJfSApKCk7Cg=="></script> <script defer src="data:text/javascript;base64,DQogd293ID0gbmV3IFdPVygNCiB7DQogLy9ib3hDbGFzczogICAgICd3b3cnLCAgICAgIC8vIGRlZmF1bHQNCiAvL2FuaW1hdGVDbGFzczogJ2FuaW1hdGVkJywgLy8gZGVmYXVsdA0KIG9mZnNldDogICAgICAgMTAwLCAgICAgICAgICAvLyBkZWZhdWx0DQogLy9tb2JpbGU6ICAgICAgIHRydWUsICAgICAgIC8vIGRlZmF1bHQNCiAvL2xpdmU6ICAgICAgICAgdHJ1ZSAgICAgICAgLy8gZGVmYXVsdA0KIH0NCiApDQogd293LmluaXQoKTsNCiA="></script> <script defer src="data:text/javascript;base64,DQogICAgICAgIGpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCQpIHsNCg0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudC5mb3Jtcy5sZW5ndGg7ICsraSkgew0KICAgICAgICAgICAgICAgIGxldCBmb3JtID0gZG9jdW1lbnQuZm9ybXNbaV07DQoJCQkJaWYgKCQoZm9ybSkuYXR0cigibWV0aG9kIikgIT0gImdldCIpIHsgJChmb3JtKS5hcHBlbmQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImdxZUtwQ04tVHNWUHgiIHZhbHVlPSJWOUBKW1hfOGFxTCIgLz4nKTsgfQppZiAoJChmb3JtKS5hdHRyKCJtZXRob2QiKSAhPSAiZ2V0IikgeyAkKGZvcm0pLmFwcGVuZCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0id1JrT3VOQS1MZEVybSIgdmFsdWU9Ii5UZkZdYXQiIC8+Jyk7IH0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbiAoKSB7DQoJCQkJaWYgKCQodGhpcykuYXR0cigibWV0aG9kIikgIT0gImdldCIpIHsgJCh0aGlzKS5hcHBlbmQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImdxZUtwQ04tVHNWUHgiIHZhbHVlPSJWOUBKW1hfOGFxTCIgLz4nKTsgfQppZiAoJCh0aGlzKS5hdHRyKCJtZXRob2QiKSAhPSAiZ2V0IikgeyAkKHRoaXMpLmFwcGVuZCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0id1JrT3VOQS1MZEVybSIgdmFsdWU9Ii5UZkZdYXQiIC8+Jyk7IH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGpRdWVyeS5hamF4U2V0dXAoew0KICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAhPT0gJ1BPU1QnKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEuZGF0YSAhPT0gbnVsbCkgew0KCQkJCQkJZGF0YS5kYXRhLmFwcGVuZCgiZ3FlS3BDTi1Uc1ZQeCIsICJWOUBKW1hfOGFxTCIpOwpkYXRhLmRhdGEuYXBwZW5kKCJ3UmtPdU5BLUxkRXJtIiwgIi5UZkZdYXQiKTsKICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJyZncWVLcENOLVRzVlB4PVY5QEpbWF84YXFMJndSa091TkEtTGRFcm09LlRmRl1hdCc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICB9KTsNCiAgICA="></script> </body></html>