AJAX: Häufig gestellte Fragen

Wann sollte ich in meinen AJAX-URLs _escaped_fragment_ und wann #! verwenden?

Du solltest auf deiner Website die #!-Syntax in allen URLs mit dem AJAX-Crawlingschema verwenden. Der Googlebot folgt keinen Hyperlinks im Format _escaped_fragment_.

Wo kann ich dieses Schema in der Praxis sehen?

AJAX-Beispielanwendungen findest du unter http://gwt.google.com/samples/Showcase/Showcase.html. Wenn du auf einen der Links auf der linken Seite klickst, siehst du, dass die URL ein #!-Hash-Fragment enthält. Die Anwendung ruft den Status auf, der diesem Hash-Fragment entspricht. Wenn du #! (z. B. http://gwt.google.com/samples/Showcase/Showcase.html#!CwRadioButton) zu ?_escaped_fragment_= (z. B. http://gwt.google.com/samples/Showcase/Showcase.html?_escaped_fragment_=CwRadioButton) änderst, gibt die Website einen HTML-Snapshot zurück.

Was passiert, wenn ich #! nicht auf meiner AJAX-Website implementiere?

Deine Seiten erscheinen vorerst eventuell nicht mehr richtig auf den Google-Suchergebnisseiten. Wir arbeiten jedoch kontinuierlich daran, dass der Googlebot mehr wie ein Browser arbeitet. Wenn die für Ihre Website erforderlichen Funktionen implementiert werden, kann der Googlebot Ihre Seiten richtig und ohne Ihre Hilfe indexieren. Jedoch bietet dieses AJAX-Crawlingschema eine Lösung für Webmaster, die bereits AJAX verwenden und sicherstellen möchten, dass ihr Content richtig indexiert wird. Wir gehen davon aus, dass dies eine gute Lösung für alle ist, die bereits HTML-Snapshots ihrer Seiten haben oder die einen monitorlosen Browser verwenden möchten, um diese HTML-Snapshots zu erhalten.

Wie aktuell sollten meine Inhalte sein?

Die Antwort auf diese Frage hängt davon ab, wie häufig sich die Inhalte deiner Anwendung ändern. Wenn sie sich häufig ändern, solltest du immer einen aktuellen HTML-Snapshot als Antwort auf eine Crawleranfrage erstellen. Andererseits gibt es beispielsweise Bibliotheksarchive, deren Inventar sich nicht regelmäßig ändert. Damit der Server nicht ständig die gleichen HTML-Snapshots erstellen muss, kannst du alle relevanten HTML-Snapshots nur einmal (und möglicherweise sogar offline) erstellen und dann für spätere Zwecke speichern. Sie könnten dem Googlebot auch mit einem 304-HTTP-Statuscode (nicht geändert) antworten.

Was ist, wenn meine Anwendung keine Hash-Fragmente verwendet?

Vielleicht sollte sie das! Durch Hash-Fragmente können Sie Ihre Anwendung erheblich schneller machen, da Hash-Fragmente vom Browser clientseitig verwaltet werden und nicht die gesamte Seite aktualisiert werden muss. Darüber hinaus ermöglichen sie Ihnen, einen Verlauf in Ihrer Anwendung zu unterstützen (die unpopuläre Zurück-Schaltfläche des Browsers). Verschiedene AJAX-Frameworks unterstützen Hash-Fragmente. Siehe beispielsweise Really Simple History, das jQuery history plugin, den Verlaufsmechanismus des Google Web Toolkits oder die ASP.NET AJAX Verlaufssteuerung.

Wenn deine Anwendung jedoch nicht mit Hash-Fragmenten strukturiert werden kann, kannst du auch ein spezielles Token in deinen Hash-Fragmenten verwenden, also in dem Teil, der in der URL nach dem # steht. Hash-Fragmente, die eindeutige Seiten bezeichnen, müssen mit einem Ausrufezeichen beginnen. Wenn deine AJAX-Anwendung beispielsweise eine solche URL enthält:

www.example.com/ajax.html#mystate

sollte sie nun so aussehen:

www.example.com/ajax.html#!mystate

Wenn deine Website das Schema übernimmt, wird sie als „AJAX crawlable“ (crawlbare AJAX-Website) betrachtet. Dies bedeutet, dass der Crawler die Inhalte deiner Anwendung erkennt, wenn deine Website HTML-Snapshots bereitstellt.

Führt dieser Ansatz zu einer Verbreitung der sogenannten Ugly-URLs mit dem Format _escaped_fragment_?

Die Syntax _escaped_fragment_ für URLs ist eine temporäre URL, die niemals von Endnutzern gesehen werden sollte. In allen Kontexten, die Nutzer sehen, sollte die sogenannte Pretty-URL mit #! statt _escaped_fragment_ verwendet werden: bei normalen Anwendungsinteraktionen, in Sitemaps, in Hyperlinks, in Weiterleitungen und in allen anderen Situationen, in denen ein Nutzer die URL sehen könnte. Aus dem gleichen Grund sind Suchergebnisse Pretty-URLs und keine Ugly-URLs.

Stellt dieses Schema eine Cloaking-Gefahr dar?

Der über Cloaking bereitgestellte Content unterscheidet sich von dem Content, der an Suchmaschinen weitergegeben wird. Dies geschieht im Allgemeinen mit der Absicht, das Ranking in den Suchergebnissen zu verbessern. Cloaking ist und bleibt ein Problem für Suchmaschinen, und es ist wichtig zu beachten, dass die Bereitstellung von AJAX-Anwendungen für Crawler keine Einladung dazu ist, Cloaking zu erleichtern. Aus diesem Grund muss der HTML-Snapshot den gleichen Content enthalten, den der Endnutzer in einem Browser sehen soll. Ist dies nicht der Fall, kann dies als Cloaking betrachtet werden. Weitere Informationen findest du hier.

Kann ich meine Flash-Dateien oder andere Rich Media-Dateien mithilfe dieses Schemas besser für Crawler zugänglich machen?

Google indexiert viele Rich Media-Dateitypen und wir arbeiten ständig daran, unser Crawling und unsere Indexierung zu verbessern. Es kann jedoch vorkommen, dass der Googlebot nicht den gesamten Content einer Flash-Anwendung oder einer anderen Rich Media-Anwendung findet, ebenso wie nicht der gesamte dynamische Content von Websites gecrawlt werden kann. Daher kann es nützlich sein, mithilfe dieses Schemas zusätzlichen Content für den Googlebot bereitzustellen. Auch hier gilt: Der HTML-Snapshot muss den gleichen Content enthalten, den der Endnutzer in einem Browser sieht. Google behält sich das Recht vor, Websites, die offenbar Cloaking verwenden, aus dem Index zu entfernen.

Was ist, wenn meine Website über Hash-Fragment-URLs verfügt, die nicht gecrawlt werden sollten?

Wenn Ihre Website das AJAX-Crawlingschema übernimmt, crawlt der Google-Crawler jede URL mit Hash-Fragmenten, die er erkennt. Wenn Sie URLs mit Hash-Fragmenten haben, die nicht gecrawlt werden sollen, sollten Sie Ihrer "robots.txt"-Datei eine Regel für einen regulären Ausdruck hinzufügen. Du kannst beispielsweise eine Konvention in deinen Hash-Fragmenten verwenden, die nicht gecrawlt werden sollen, und dann alle URLs in deiner robots.txt-Datei ausschließen, die mit dieser Konvention übereinstimmen. Nehmen wir an, alle nicht indexierbaren Status hätten das Format #DONOTCRAWLmyfragment. Wenn du verhindern möchtest, dass der Googlebot diese Seiten crawlt, kannst du Folgendes in die robots.txt-Datei einfügen:

Disallow: /*_escaped_fragment_=DONOTCRAWL

Was ist mit der bisherigen Verwendung von #! in Hash-Fragmenten?

#! wird in bestehenden Hash-Fragmenten nur unregelmäßig als Token verwendet. Es wird allerdings nicht durch die URL-Spezifikation ausgeschlossen. Was passiert, wenn ich in meiner Anwendung #! verwende, das neue AJAX-Crawlingschema aber nicht übernehmen möchte? Du kannst zum Beispiel eine entsprechende Anweisung für den Crawler in deine robots.txt-Datei einfügen.

Disallow: /*_escaped_fragment_

Wenn deine Anwendung nur die URL www.beispiel.de/index.html#!meinstatus beinhaltet, bedeutet das allerdings, dass diese nicht gecrawlt wird. Enthält die Anwendung darüber hinaus die reine URL www.beispiel.de/ajax.html, wird diese gecrawlt.

Wie steht es um die Barrierefreiheit?

Da es derzeit üblich ist, statische Inhalte für Suchmaschinen zur Verfügung zu stellen, haben Websiteinhaber ihre Anwendungen besser für Nutzer mit Behinderungen zugänglich gemacht. Vor diesem Hintergrund erscheint der Begriff der Barrierefreiheit in einem gänzlich neuen Licht: Websiteinhaber können mithilfe eines monitorlosen Browsers und ganz ohne manuelle Aktionen HTML-Snapshots erstellen, die alle relevanten Inhalte umfassen und von Screenreadern genutzt werden können. Da weniger manuelle Aktionen erforderlich sind, ist es so einfacher, die statischen Inhalte auf dem neuesten Stand zu halten. Mit anderen Worten: Websiteinhaber haben nun einen noch größeren Anreiz, ihre Anwendungen für Nutzer mit Behinderungen zugänglich zu machen.

Wie sollte ich rel="canonical" verwenden?

Verwende <link rel="canonical" href="http://example.com/ajax.html#!foo=123" /> und nicht <link rel="canonical" href="http://example.com/ajax.html?_escaped_fragment_=foo=123" />.

Welche URL sollte ich in meine Sitemap einfügen?

Deine Sitemap sollte die Version enthalten, die du bevorzugt in den Suchergebnissen sehen möchtest, also http://example.com/ajax.html#!foo=123.

Wie wirken sich die #!-URLs auf Produktfeeds aus?

Es ist normal, dass Websiteinhaber die gleichen URLs für Google Shopping und die Websuche verwenden möchten. Im Allgemeinen sollte die #!-Version der URL als „kanonische“ Version behandelt werden, die in allen Kontexten verwendet wird. Die URL mit _escaped_fragment_ ist eine temporäre URL, die Endnutzer nie sehen sollten.

Ich verwende HtmlUnit als monitorlosen Browser und er funktioniert nicht. Woran liegt das?

Wenn "er funktioniert nicht" bedeutet, dass HtmlUnit nicht den erwarteten Snapshot zurückgibt, hat er wahrscheinlich nicht genug Zeit, um die JavaScript- und/oder XHR-Anfragen auszuführen. Versuche Folgendes, um das Problem zu beheben:

  • Verwende NicelyResynchronizingAjaxController. Dann wartet HtmlUnit auf alle ausstehenden XHR-Aufrufe.
  • Erhöhe die Wartezeit für waitForBackgroundJavaScript und/oder waitForBackgroundJavaScriptStartingBefore.

So wird dein Problem höchstwahrscheinlich gelöst. Falls es weiterhin besteht, lies dir auch die FAQ zu HtmlUnit durch: http://htmlunit.sourceforge.net/faq.html. Für den Browser gibt es auch ein Nutzerforum.