Verwenden Sie PushState und Precomposition
Die derzeitige (2015) Methode hierfür ist die Verwendung der JavaScript-PushState-Methode.
PushState ändert die URL in der oberen Browserleiste, ohne die Seite neu zu laden. Angenommen, Sie haben eine Seite mit Registerkarten. Die Registerkarten verbergen und zeigen Inhalte an, und der Inhalt wird dynamisch eingefügt, entweder mit AJAX oder indem Sie einfach display: none und display: block einstellen, um den korrekten Inhalt der Registerkarten auszublenden und anzuzeigen.
Wenn Sie auf die Registerkarten klicken, aktualisieren Sie die URL in der Adressleiste mit pushState. Verwenden Sie beim Rendern der Seite den Wert in der Adressleiste, um zu bestimmen, welche Registerkarte angezeigt werden soll. Angular Routing erledigt dies automatisch für Sie.
Vorkomposition
Es gibt zwei Möglichkeiten, eine PushState Single Page App (SPA) zu starten.
- Über PushState, wo der Benutzer auf einen PushState-Link klickt und der Inhalt in AJAXed ist.
- Durch direktes Klicken auf die URL.
Der erste Treffer auf der Website beinhaltet das direkte Aufrufen der URL. Nachfolgende Treffer werden einfach AJAX im Inhalt, wenn der PushState die URL aktualisiert.
Crawler sammeln Links von einer Seite und fügen sie zur späteren Verarbeitung einer Warteschlange hinzu. Dies bedeutet, dass für einen Crawler jeder Treffer auf dem Server ein direkter Treffer ist und er nicht über Pushstate navigiert.
Precomposition bündelt die anfängliche Nutzlast in der ersten Antwort vom Server, möglicherweise als JSON-Objekt. Dadurch kann die Suchmaschine die Seite rendern, ohne den AJAX-Aufruf auszuführen.
Es gibt Hinweise darauf, dass Google möglicherweise keine AJAX-Anforderungen ausführt. Mehr dazu hier:
https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo
Suchmaschinen können JavaScript lesen und ausführen
Google ist seit einiger Zeit in der Lage, JavaScript zu analysieren. Deshalb haben sie ursprünglich Chrome entwickelt, um als voll funktionsfähiger Headless-Browser für die Google-Spinne zu fungieren. Wenn ein Link ein gültiges href-Attribut hat, kann die neue URL indiziert werden. Es gibt nichts mehr zu tun.
Wenn das Klicken auf einen Link zusätzlich einen PushState-Aufruf auslöst, kann der Benutzer über PushState auf der Site navigieren.
Suchmaschinenunterstützung für PushState-URLs
PushState wird derzeit von Google und Bing unterstützt.
Google
Hier ist Matt Cutts, der auf Paul Irishs Frage zu PushState for SEO antwortet:
http://youtu.be/yiAF9VdvRPw
Hier kündigt Google die vollständige JavaScript-Unterstützung für die Spinne an:
http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html
Das Ergebnis ist, dass Google PushState unterstützt und PushState-URLs indiziert.
Siehe auch Google Webmaster-Tools als Googlebot abrufen. Sie werden sehen, dass Ihr JavaScript (einschließlich Angular) ausgeführt wird.
Bing
Hier ist Bings Ankündigung der Unterstützung für hübsche PushState-URLs vom März 2013:
http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/
Verwenden Sie keine HashBangs #!
Hashbang-URLs waren eine hässliche Lücke, in der der Entwickler eine vorgerenderte Version der Site an einem bestimmten Ort bereitstellen musste. Sie funktionieren immer noch, aber Sie müssen sie nicht verwenden.
Hashbang-URLs sehen folgendermaßen aus:
domain.com/#!path/to/resource
Dies würde mit einem Metatag wie diesem gepaart werden:
<meta name="fragment" content="!">
Google indiziert sie nicht in dieser Form, sondern ruft stattdessen eine statische Version der Website von der URL _escaped_fragments_ ab und indiziert diese.
Pushstate-URLs sehen aus wie jede normale URL:
domain.com/path/to/resource
Der Unterschied besteht darin, dass Angular sie für Sie behandelt, indem die Änderung an document.location abgefangen wird, die sich in JavaScript damit befasst.
Wenn Sie PushState-URLs verwenden möchten (und dies wahrscheinlich auch tun), entfernen Sie alle alten URLs und Metatags im Hash-Stil und aktivieren Sie einfach den HTML5-Modus in Ihrem Konfigurationsblock.
Testen Sie Ihre Site
Die Google Webmaster-Tools enthalten jetzt ein Tool, mit dem Sie eine URL als Google abrufen und JavaScript so rendern können, wie Google es rendert.
https://www.google.com/webmasters/tools/googlebot-fetch
Generieren von PushState-URLs in Angular
Legen Sie den HTML5-Modus für Ihr $ locationProvider-Objekt fest, um echte URLs in Angular anstelle von # mit Präfix zu generieren.
$locationProvider.html5Mode(true);
Serverseite
Da Sie echte URLs verwenden, müssen Sie sicherstellen, dass dieselbe Vorlage (plus einige vorkomponierte Inhalte) von Ihrem Server für alle gültigen URLs gesendet wird. Wie Sie dies tun, hängt von Ihrer Serverarchitektur ab.
Seitenverzeichnis
Ihre App verwendet möglicherweise ungewöhnliche Navigationsformen, z. B. Schweben oder Scrollen. Um sicherzustellen, dass Google Ihre App steuern kann, würde ich wahrscheinlich vorschlagen, eine Sitemap zu erstellen, eine einfache Liste aller URLs, auf die Ihre App reagiert. Sie können dies am Standardspeicherort (/ sitemap oder /sitemap.xml) platzieren oder Google mithilfe von Webmaster-Tools darüber informieren.
Es ist trotzdem eine gute Idee, eine Sitemap zu haben.
Browser-Unterstützung
Pushstate funktioniert in IE10. In älteren Browsern greift Angular automatisch auf URLs im Hash-Stil zurück
Eine Demoseite
Der folgende Inhalt wird unter Verwendung einer Pushstate-URL mit Vorkomposition gerendert:
http://html5.gingerhost.com/london
Wie überprüft werden kann, wird der Inhalt unter diesem Link indiziert und in Google angezeigt.
Serving 404 und 301 Header Status Codes
Da die Suchmaschine bei jeder Anfrage immer auf Ihren Server trifft, können Sie Header-Statuscodes von Ihrem Server bereitstellen und erwarten, dass Google sie sieht.