Post-Redirect-Get


Als Post/Redirect/Get-Muster oder kurz PRG Pattern wird ein Entwicklungsansatz bezeichnet, der Duplicate Content beim Absenden von Formularen verhindert und eine intuitivere Benutzerschnittstelle für den User bereitstellt. Das Post-Redirect-Get Pattern ermöglicht das Setzen von Lesezeichen, Teilen von URLs und unterstützt das erneute Laden einer Website, die Formulardaten abfragt und sendet - ohne Duplicate Content oder Near Duplicate Content zu erzeugen.

Das PRG Pattern wird auch häufig bei großen Onlineshops eingesetzt, um mit Faceted Navigation (deutsch: Filternavigation) die Eingrenzung von Produkten und Produktkategorien zu ermöglichen und das Crawlbudget zu entlasten. Aus Sicht des Webdesigns und der Suchmaschinenoptimierung ist das PRG Pattern empfehlenswert, um DC zu vermeiden, teilbare URLs bereitzustellen und Crawling-Ressourcen zu schonen. Die Umsetzung des Entwicklungsansatzes erfordert Kenntnisse der Post- und Get-Abfragen im HTTP-Protokoll der Version 1.1 und kann unter Umständen Canonical Tags und Noindex-Auszeichnungen nach sich ziehen.

Allgemeine Informationen zum Thema

Der Hintergrund der Nutzung des PRG-Pattern ist folgender: Bei der Übermittlung von Formulardaten über eine HTTP Post Anfrage kann diese Anfrage mehrfach beim Server eingereicht werden, wenn der Nutzer, der die Anfrage absendet, das Formular mit dem F5- oder dem Reloadbutton erneut lädt. In der Folge können Webformulare doppelt versendet oder Bestellungen doppelt aufgegeben werden. Um diese doppelten Inhalte zu vermeiden, kann das PRG-Pattern eingesetzt werden: Statt einer Website mit Duplicate Content wird die Website angezeigt, die mittels Post-Anfrage und per Redirect ausgeliefert wird.[1]

Funktionsweise

Wenn ein Client ein Webformular aufruft und ausfüllt, wird dieses normalerweise über eine Post-Anfrage zu dem Server übermittelt. Der Server führt eine Veränderung an der Datenbank durch und trägt die Informationen aus dem Webformular dort ein. Üblicherweise sendet der Server eine Bestätigungsseite an den Client zurück. Falls Fehler oder ungültige Eingaben vorhanden sind, wird eine Webformular angezeigt, das den Nutzer auf diese Fehler hinweist. Der Nutzer korrigiert die Daten und klickt auf Absenden: die korrekten Daten werden an den Server gesendet. Sollte der Nutzer das Webformular jetzt neu laden, entsteht eine weitere, unerwünschte Datenübermittlung zweier Einträge aus der Datenbank.

Hier setzt das PRG-Pattern an: Nach dem Eintrag in die Datenbank, wird ein Redirect an den Client gesendet. Der Client startet daraufhin eine Get-Anfrage an den Server, der wiederum eine Bestätigungsseite zurücksendet. Falls der Nutzer nun die Website neu laden sollte, wird lediglich eine weitere Get-Anfrage an den Server gesendet. Statt einer Datenbank-Veränderung mit der Post-Anfrage bekommt der Nutzer die Bestätigungsseite dargestellt: Seine Anfrage ist bereits erfolgt und das Neuladen des Webformulars zieht keine Doppelten Inhalte nach sich.

Das PRG-Pattern besteht aus zwei HTTP-Anfragen und einem Redirect, der die veränderten Ergebnisse referenziert. Das Muster erlaubt die semantisch korrekte Verarbeitung von Post- und Get-Anfragen im HTTP 1.1 Protokoll.[2]

  • POST: Per Post-Anfrage wird ein Formular an den Server gesendet und ein Eintrag in der Datenbank verändert.
  • Redirect: Nach einer Post-Anfrage wird die richtige Website mit den veränderten Daten mittels Redirect-Anweisung (HTTP 303) an den Client geliefert.
  • GET: Der Client fordert eine Bestätigungsseite an. Bei erneutem Laden geschieht dies ebenfalls, ohne eine Datenbankveränderung und möglichem Duplicate Content.

Praxisbezug

In der Praxis ist die Umsetzung des PRG-Pattern von der verwendeten Programmiersprache auf der Serverseite und dem Content Management System abhängig. Eine Lösung in PHP kann wie folgt aussehen: Das Webformular heißt hier echo.php, es muss erzeugt werden und der verarbeitende Server muss PHP-Parsing unterstützen - beziehungsweise PHP als serverseitige Sprache benutzen. Im Beispiel wird das erste Laden der Datei durch einen Nutzer ausgelöst, der zu einer Website www.beispiel.de/echo.php navigiert. Das HTML in der Datei wird angezeigt. Anschließend gibt der Nutzer Daten ein und drückt Enter. Die Eingabe wird als Datenbankänderung an den Server übermittelt und per Get-Anfrage an den Client ausgeliefert. Auch bei einer weiteren Get-Anfrage bleibt die Eingabe aktuell, da mittels Session die veränderten Inhalte erhalten bleiben. Das Ergebnis ist eine HTML Website, die die Eingabe enthält, aber durch eine Get-Anfrage zustande kommt – und nicht durch eine weitere Post-Anfrage doppelte Inhalte erzeugt.

<?php
    session_start();

    $echoedShout = "";

    if(count($_POST) > 0) {
        $_SESSION['shout'] = $_POST['shout'];

        header("HTTP/1.1 303 See Other");
        header("Location: http://$_SERVER[HTTP_HOST]/echo.php");
        die();
    }
    else if (isset($_SESSION['shout'])){
        $echoedShout = $_SESSION['shout'];

        /*
            Hier kommt der Quellcode hin, der die Datenbank verändert.
        */

        session_unset();
        session_destroy();
    }
?>

<!DOCTYPE html>
<html>
<head><title>PRG Pattern Beispiel in PHP</title>

<body>
    <?php echo "<p>$echoedShout</p>" ?>
    <form action="echo.php" method="POST">
        <input type="text" name="shout" value="" />
    </form>
</body>
</html>

[3]

Bedeutung für die Suchmaschinenoptimierung

Das PRG-Pattern wird von Webdesignern und SEOs in bestimmten Fällen empfohlen. Im Detail ist die Realisierung von vielen verschiedenen Faktoren abhängig, die mit der Servertechnologie in Verbindung stehen. CMS, serverseitige Programmiersprachen und unterschiedliche Versionen von PHP oder ASP.NET können zu Fehlern führen und die Umsetzung erschweren. Insbesondere bei Anwendungsfällen wie Filternavigationen sollte genau darauf geachtet werden, welche Ressourcen Nutzern und Suchmaschinen angezeigt werden. Im Einzelfall können Canonical Tags, Noindex-Anweisungen und SEO-Basics wie sprechende URLs einen Maßstab für die einbahnfreie Verwendung des PRG-Patterns offenlegen. Im Falle von Filternavigationen kann zudem das Crawlbudget zu einem gewissen Maß gesteuert werden.[4]

Einzelnachweise

  1. PRG-Pattern sumax.de. Abgerufen am 05.12.2016
  2. HTTP Methoden prozesse-und-systeme.de. Abgerufen am 05.12.2016
  3. Post-Redirect-Get Pattern in PHP wordsideasandthings.blogspot.de. Abgerufen am 05.12.2016
  4. POST, GET & PRG-Pattern für Faceted Navigation und große Seiten catbirdseat.de. Abgerufen am 05.12.2016

Weblinks