pushState et SEO

beaucoup de gens ont dit, utilisez pushState plutôt que hashbang.

ce que je ne comprends pas, c'est, comment seriez-vous moteur de recherche convivial sans utiliser hashbang?

probablement votre contenu pushState est généré par le code JavaScript côté client.

le scénario est donc:

je suis sur example.com . Mon utilisateur clique sur le lien: href="example.com/blog"

pushState capture cliquez, met à jour l'URL, saisit un fichier JSON de quelque part, et crée la liste des billets de blog dans la zone de contenu.

avec hashbangs, google sait aller à L'URL escaped_fragment pour obtenir leur contenu statique.

avec pushState, Google ne voit rien car il ne peut pas utiliser le code JavaScript pour charger le JSON et ensuite créer le modèle.

La seule façon que je peux voir, c'est pour rendre le modèle sur le serveur côté, mais qui nie complètement les avantages de pousser la couche application au client.

est-ce que je me trompe, pushState n'est pas du tout SEO friendly pour les applications côté client?

75
demandé sur Peter Mortensen 2011-06-01 01:37:10

3 réponses

Qu'en est-il de l'utilisation de la balise meta que Google suggère pour ceux qui ne veulent pas hash-bangs dans leurs URLs: <meta name="fragment" content="!">

voir ici pour plus d'informations: https://developers.google.com/webmasters/ajax-crawling/docs/getting-started

malheureusement, Je ne pense pas que NickC a clarifié la question que je pensais que L'OP avait. Le problème est simplement que nous ne savons pas qui nous servent de contenu si nous n'utilisons pas le hachage-bang. Pushstate ne résout pas pour nous. Nous ne voulons pas que les moteurs de recherche disent aux utilisateurs finaux de naviguer vers une URL qui crache hors JSON non formaté. Nous créons plutôt des URLs (qui déclenchent d'autres appels vers D'autres URLs) qui récupèrent des données via AJAX et les présentent à l'utilisateur de la manière que nous préférons. Si l'utilisateur n'est pas un homme, comme alternative, nous pouvons servir un html-instantané, de sorte que les moteurs de recherche peut bien diriger l'utilisateur vers l'URL qu'ils s'attendent à trouver les données demandées à (et d'une façon présentable). Mais le défi ultime est de savoir comment déterminer le type d'utilisateur? Oui, on peut éventuellement utiliser .htaccess ou quelque chose pour réécrire L'URL des bots de moteur de recherche que nous détectons, mais je ne suis pas sûr à quel point c'est infaillible et futuriste. Il est également possible que Google puisse pénaliser les gens qui font ce genre de choses, mais je n'ai pas fait de recherche complète. Ainsi, le combo (pushstate + meta tag de google) semble être une solution probable.

15
répondu prograhammer 2012-09-06 02:51:24

est pushState mauvais si vous avez besoin des moteurs de recherche pour lire votre contenu?

non, la discussion sur pushState est axée sur la réalisation du même processus général pour les hashbangs, mais avec des URLs plus attrayantes. Pensez à ce qui se passe vraiment quand vous utilisez des hashbangs...

vous dites:

avec hashbangs, Google sait aller à L'URL escaped_fragment pour obtenir leur contenu statique.

donc en d'autres termes,

  1. Google voit un lien vers example.com/#!/blog
  2. Google demandes example.com/?_escaped_fragment_=/blog
  3. vous retournez un instantané du contenu que l'utilisateur devrait voir

Comme vous pouvez le voir, il s'appuie déjà sur le serveur. si vous ne servez pas un instantané du contenu du serveur, alors que votre site n'est pas indexé correctement.

alors comment Google va-t-il voir quoi que ce soit avec pushState?

avec pushState, google ne voit rien car il ne peut pas utiliser le javascript pour charger le json et ensuite créer le modèle.

en fait, Google va voir tout ce qu'il peut demander à site.com/blog . Une URL pointe toujours vers une ressource sur le serveur, et les clients obéissent toujours le présent contrat. Bien sûr, pour les clients modernes, Javascript a ouvert de nouvelles possibilités pour récupérer et interagir avec le contenu sans un page rafraîchir, mais les contrats sont les mêmes.

donc l'élégance voulue de pushState est qu'il sert le même contenu à tous les utilisateurs, anciens et nouveaux, js-capable et pas, mais les nouveaux utilisateurs obtenir une expérience améliorée .

Comment obtenir Google à voir votre contenu?

  1. Le Facebook de l'approche - servir le même contenu à l'URL site.com/blog que votre client application serait de se transformer en lorsque vous appuyez sur /blog sur l'état. (Facebook n'utilise pas pushState encore que je sache, mais ils le font avec des hashbangs)

  2. Twitter approche - rediriger toutes les Url de la hashbang équivalent. En d'autres termes, un lien vers "/blog" pousse /blog sur l'état. Mais si c'est demandé directement, le navigateur finit par #!/blog . (Pour Googlebot, ceci conduirait alors à _escaped_fragment_ comme vous voulez. Pour les autres clients, vous pouvez pushState retour à la jolie URL).

alors est-ce que vous perdez la capacité _escaped_fragment_ avec pushState ?

dans quelques commentaires différents, vous avez dit

fragment échappé est complètement différent. Vous pouvez servir le contenu pur non-themed, le contenu caché, et ne pas être mis sous la charge que les pages normales sont.

la solution idéale pour Google est soit de faire des sites JavaScript, soit d'implémenter un moyen de savoir qu'il y a une URL de fragment échappée, même pour les sites pushstate (robots.txt?).

les prestations que vous avez mentionnées ne sont pas limitées à _escaped_fragment_ . Qu'il ne la réécriture pour vous et utilise un spécialement nommé GET param est vraiment un détail de mise en œuvre. Il n'y a rien de vraiment spécial à ce sujet que vous ne pourriez pas faire avec les URLs standard - en d'autres termes, réécrire /blog en /?content=/blog sur votre propre utilisation en utilisant mod_rewrite ou l'équivalent de votre serveur.

et si vous ne servez pas du tout de contenu côté serveur?

Si vous ne pouvez pas réécrire les Url et servir un certain type de contenu à /blog (ou n'importe quel état que vous avez poussé dans le navigateur), alors votre serveur ne respecte plus vraiment le contrat HTTP.

c'est important parce qu'une page rechargée (pour quelque raison que ce soit) va tirer le contenu à cette URL. (Voir https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review - "vue de la source et de recharger à la fois de récupérer le contenu à la nouvelle URI si l'on a été poussé.")

c'est non pas que dessiner des interfaces utilisateur une fois sur le côté client et charger du contenu via JS API est un mauvais objectif, c'est juste qu'il n'est pas vraiment pris en compte avec HTTP et URLs et il est fondamentalement pas rétrocompatible.

à l'heure actuelle, c'est la chose exacte à laquelle les hashbangs sont destinés - pour représenter des états de page distincts qui sont navigués sur le client et non sur le serveur. Un rechargement, par exemple, chargera le même ressource qui peut alors lire, analyser et traiter la valeur hachée.

il se trouve juste qu'ils ont également été utilisés (notamment par Facebook et Twitter) pour changer l'histoire à un emplacement côté serveur sans un rafraîchissement de page. C'est dans ces cas d'utilisation que les gens recommandent d'abandonner les hashbangs pour pushState.

si vous rendez tout le contenu côté client, vous devriez pensez à pushState comme faisant partie d'une API d'histoire plus pratique, et non pas une façon de sortir des hashbangs.

97
répondu Nicole 2016-12-27 09:06:54

toute discussion intéressante sur pushState et #! , et je ne vois toujours pas comment pushState remplace #!'fin que l'original de l'affiche de la demande.

notre solution pour rendre notre Site/application Ajax à 99% JavaScript SEOable utilise #! bien sûr. Puisque le rendu client est fait via HTML, JavaScript et PHP, nous utilisons la logique suivante dans un chargeur contrôlé par notre page landing. Les fichiers HTML sont totalement séparés de JavaScript et PHP parce que nous voulons le même HTML dans les deux (pour la plupart). Le JavaScript et le PHP font généralement la même chose, mais le code PHP est moins compliqué que le JavaScript est une expérience utilisateur beaucoup plus riche.

le JavaScript utilise jQuery pour injecter dans HTML le contenu qu'il veut. PHP utilise PHPQuery pour injecter dans le HTML le contenu qu'il veut-en utilisant "presque" la même logique, mais beaucoup plus simple que la version PHP sera seulement utilisé pour afficher une version SEOable avec des liens SEOable et ne pas être interagit avec comme la version JavaScript.

Tous sont les trois composants qui composent une page, une page.htm, page.js et de la page.php existe pour tout ce qui utilise le fragment échappé pour savoir s'il faut charger la version PHP à la place de la version JavaScript. La version PHP n'a pas besoin d'exister pour les contenus Non-Seoables (comme les pages qui ne peuvent être vues qu'après l'ouverture de session de l'utilisateur). Tout est simple.

je suis toujours perplexe comment certains développeurs front end partez développer de grands sites (avec la richesse de Google Docs) sans utiliser les technologies côté serveur en conjonction avec ceux du navigateur... Si JavaScript n'est même pas activé, alors notre solution 99% JavaScript ne fera rien sans le PHP en place.

il est possible d'avoir une belle URL pour atterrir sur une page PHP servie et rediriger vers une version JavaScript si JavaScript est activé, mais ce n'est pas agréable du point de vue de l'utilisateur puisque les utilisateurs sont les plus public important.

sur une note latérale. Si vous faites juste un site Web simple qui peut fonctionner sans aucun JavaScript, alors je peux voir pushState étant utile si vous voulez améliorer progressivement votre expérience utilisateur à partir d'un simple contenu statiquement rendu dans quelque chose de mieux, mais si vous voulez donner à votre Utilisateur la meilleure expérience de la aller obtenir... disons que votre dernier jeu écrit en JavaScript ou quelque chose comme Google Docs puis il est utilisé pour cette solution est quelque peu limitant comme tombant gracieusement en arrière ne peut aller jusqu'à loin avant que l'expérience de l'utilisateur est douloureuse par rapport à la vision du site.

0
répondu Julian 2016-12-27 09:12:22