Post/Redirect/Get

aus Wikipedia, der freien Enzyklopädie

Post/Redirect/Get (PRG) oder Redirect After Post (deutsch Umleitung nach dem Versand) ist ein Verhaltensmuster in der Entwicklung von Webanwendungen. Das Muster verhindert, dass Formulare durch den Anwender mehrfach gesendet werden.[1] PRG wird zudem in der Suchmaschinenoptimierung (SEO), insbesondere bei Filter-Navigationen in Online-Shops, eingesetzt[2].

Hintergrund

Diagramm des Doppel-POST-Problems.

Wenn ein Webformular mittels der HTTP-Anfragemethode POST übermittelt wird, kann es einige Zeit dauern, bis der Server auf die Anfrage reagiert. Wenn der Anwender ungeduldig ist und das Formular mittels eines GET neu lädt, so kann das Formular mittels eines POST erneut gesendet werden und dadurch einen unerwünschten Zustand verursachen.

Dauert beispielsweise der Bestellvorgang in einem Webshop zu lange, so könnte der Anwender ungeduldig werden, die Seite neu laden und den Bestellvorgang erneut versuchen. Hierdurch kann es zu einer ungewollten doppelten Bestellung kommen.

Funktionsweise

Diagramm von Post/Redirect/Get

Um das Problem des doppelten POST zu verhindern, wird der Benutzer beim Einleiten des Bestellvorgangs mittels des HTTP-Statuscode „303: See Other“ auf eine Seite umgeleitet, welche mittels der GET-Methode auf die erfolgreiche Bearbeitung des POST-Vorgangs wartet.

Lädt der Benutzer vor der Beendigung der Bearbeitung die Seite erneut, kommt er wieder auf die Warteseite und kann keinen erneuten POST absetzen.

Einsatz in der Suchmaschinenoptimierung

Filter Navigationen in Online-Shops (häufig auch als Layered- oder Facettierte Navigation bezeichnet) erlauben dem Nutzer das Sortiment nach verschiedenen Produktmerkmalen wie Farbe, Größe, Material usw. zu filtern. Aus Sicht der Suchmaschinenoptimierung ist diese Funktion jedoch problematisch, da hierbei (Near-) Duplicate Content sowie nahezu unendliche viele zusätzliche URLs entstehen, was wiederum zu einer Verschwendung von Crawling-Budget führt.

Die PRG Methode ist ein Ansatz um diese SEO-Probleme im Zusammenhang mit Filter-Navigationen zu beheben[3] und ist dabei anderen im Bereich SEO üblichen Lösungsansätzen, die die Probleme nur unzureichend adressieren, überlegen[4]. Die PRG Methode wird jedoch von gängigen CMS und Online-Shop-Systemen in der Regel standardmäßig nicht unterstützt und muss individuell ergänzt werden (Beispiel-Implementierung für WordPress[5]).

Alternativen

Grundsätzlich besteht die Möglichkeit mit dem POST eine Ressource mit einem eindeutigen Uniform Resource Identifier (URI) zu erstellen. Wird versucht die Ressource mit derselben URI erneut zu erstellen, so kann der Server den erneuten POST, etwa mit dem Statuscode „405: Method Not Allowed“ oder „409: Conflict“, ablehnen.

Single-Page-Webanwendungen

In einer Single-Page-Webanwendung kann der „Submit“-Button deaktiviert werden, um ein erneutes Absetzen der POST-Methode zu verhindern. Dieser Mechanismus reicht aber nicht aus, falls der Anwender die Seite erneut lädt. Es sollten daher vom Webentwickler zusätzliche Maßnahmen getroffen werden, um einen entsprechenden Fehler nach Möglichkeit zu verhindern.

Eine Alternative ist es, wenn der Benutzer die Möglichkeit bekommt, seine letzten Aktionen zu überprüfen und rückgängig zu machen. So kann beispielsweise ein Webshop nach erfolgter Bestellung auf die Liste der letzten Bestellungen umleiten, sodass der Benutzer eine Doppelbestellung sofort erkennt und den zweiten Bestellvorgang stornieren kann.

Quellen

  1. Ward Cunningham: Redirect After Post. In: Portland Pattern Repository. 12. September 2014, abgerufen am 7. Mai 2017 (englisch).
  2. Post-Redirect-Get. Abgerufen am 19. Mai 2018.
  3. POST, GET & PRG-Pattern, Faceted Navigation und der Einsatz im SEO. In: Catbird Seat - Agentur für Digitales Marketing. 11. Februar 2016 (catbirdseat.de [abgerufen am 19. Mai 2018]).
  4. l▷ SEO Optimierung für Layered Navigations mit PRG Pattern ✔ | JaJuMa-Blog. Abgerufen am 19. Mai 2018 (deutsch).
  5. Tobias Keller: PRG Pattern in WordPress implementieren. 26. August 2018, abgerufen am 28. August 2018 (deutsch).