Hallo,
Es gibt ja das allseits bekannte Problem: Wenn ich ein PHP-Script habe, das über POST aufgerufen wird, dann kann der Benutzer nicht so einfach über die Vor/Zurück-Knöpfe des Browser navigieren.
Ein kleines Beispiel, um das ganze zu verdeutlichen:
Ich habe eine Benutzerverwaltung gebaut, die beim Aufruf ohne Parameter eine Liste aller Benutzer anzeigt. Wenn ich nun auf einen Link klicke, um einen Benutzer anzulegen, erscheint das entspr. Formular. Jetzt lege ich einen Benutzer an und (falls Validierung und Einfügen in DB klappt) zeige ich die Meldung "Der Benutzer blablabla wurde erfolgreich angelegt an" und darunter wieder diese Liste aller Benutzer. Wenn ich nun wieder auf den Link "Hinzufügen" klicke, dann erscheint ja wieder mein leeres Formular. Doch dann überlege ich mir es anders und drücke auf den Zurück-Knopf des Browsers. Wenn ich das im IE mache, kommt so ein saublöder Text "Die Seite ist nicht mehr gültig" oder so; der Mozilla fragt mich, ob ich die Daten noch mal senden soll. Ich fange natürlich einen doppelten POST ab (spätestens kurz vor dem Insert sagt er "Benutzer existiert schon"), das ist nicht das Problem; aber das mit der Abfrage im Mozilla bzw. dieser komischen Seite im IE (wo man dann erst auf Aktualisieren drücken soll, damit man noch mal auf die Seite kommt) ist extrem lästig für den Benutzer.
Daher hab' ich mir einen kleinen Workaround ausgedacht, der mit allen Browsern unter denen ich das bisher getestet habe, funktioniert. Ich mache folgendes: Wenn das Formular per POST kommt, dann verarbeite ich die Daten und merke mir, was ich ausgeben will und dann mache ich einen HTTP-Redirect. Das hat zur Folge, dass das 1 History-Eintrag im Browser bleibt und die zweite Seite per GET ausgeliefert wird (und daher der Browser nicht so etwas macht, wie oben geschildert) Soweit ich sehen kann, hat die Methode einen kleinen, jedoch vernachlässigbaren Nachteil: es werden 2 Requests an den Server geschickt. Bei Connection: keep-alive ist das jedoch nicht so sehr problematisch (und das können die meisten; die die es nicht können, warten halt ca. 1/2 sek. länger)
Jetzt hätte ich mehrere Fragen dazu:
1. In der HTTP-Spezifikation steht nichts darüber (es sei denn, ich habe etwas übersehen), was für eine Methode bei einem Location-Header f+r den nächsten Request verwendet werden soll (Ausnahme: bei PUT soll man danach GET verwenden) Hab' ich da was übersehen? Wenn nein (d.h. in der Spezifikation wird das offen gelassen), reagieren alle Browser so? Kann ich mich darauf verlassen?
2. Gibt es bei dieser Methode noch weitere Nachteile?
3. Könnte man das auch anders realisieren?
Grüße,
Christian
[der hofft, dass das nicht zu theoretisch wird]