2013-02-23 3 views
7

Nach der Verarbeitung einer POST-Anfrage führe ich die Standard-Umleitung auf die gleiche Seite durch, damit der Benutzer beim erneuten Laden der Seite kein Dialogfeld "Formular erneut senden" (oder gleichwertig) erhält.Warum gibt Chrome eine "Formularwiederherstellung bestätigen" aus, auch wenn ich das PRG-Muster verwende?

Ich verwende einen 303 Antwortstatuscode.

Hier ist der Code:

header("HTTP/1.1 303 See Other"); 
header("Location: " . $_SERVER['REQUEST_URI']); 
exit(); 

Dies als in Safari und FF erwartet funktioniert. Chrome öffnet den Dialog "Formular erneut senden".

In Chrome kann ich den Netzwerkinspektor verwenden, um zu sehen, dass die 303-Weiterleitung tatsächlich ausgegeben wird, und es gibt ein GET nach meinem ersten POST.

Aber wenn ich versuche, die Seite an diesem Punkt neu zu laden, bekomme ich die "Confirm Form Resubmission".

Wenn ich die URL durch Hinzufügen eines falschen Abfrageparam ändern, geschieht dies nicht. Das ist ...

header("HTTP/1.1 303 See Other"); 
header("Location: " . $_SERVER['REQUEST_URI'] . '?foo'); 
exit(); 

... funktioniert gut.

Versucht Chrome, zu clever zu sein und das Nachladen der gleichen Seite kurz zu machen? Oder ist das ein bekanntes Problem? Ich habe einige Zeit damit verbracht, mich umzusehen, aber abgesehen von einer Million Fällen von Leuten, die nur das PRG-Muster brauchen, nichts.

+0

Chrome hat eine Menge sehr Kuriosumumleitung Handhabung. Vielleicht ist 307 (oder 302) eine bessere Wahl. – Oliver

+0

Danke, aber 307 wiederholt die gleiche Anfrage, so dass es eine Umleitungsschleife verursacht. – Greg

+0

Ich weiß nicht, warum das ein Problem sein sollte, aber Sie können immer 302 verwenden. – Oliver

Antwort

10

Dies scheint ein Fehler in Chrome 25 Getestet habe ich es in Virtualbox mit Chrome 24 und 25

Chrome 24 => kein Dialog

Chrome 25 => Dialog

Chrome aktualisiert werden

Vielleicht sollten Sie einen Fehler einreichen. :-)

+0

Es wurde bereits ein Fehler gemeldet. https://code.google.com/p/chromium/issues/detail?id=21245. Ich hätte zuerst nachsehen sollen. : -/ – Greg

+0

Scheint so, als wäre dieser Fehler wieder aufgetreten. In Chrome 24 gibt es keine Probleme !? Das ist, was ich mit Kuriositätenbehandlung gemeint habe. :-) – Oliver

+2

Ich habe einen neuen Fehler für sie eingereicht, da ich denke, sie sind nicht verwandt https://code.google.com/p/chromium/issues/detail?id=177855 – Oliver

0

Sie können mit verschiedenen URI

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
     header('Location: proxy.php?uri='.$_SERVER['REQUEST_URI'], true, 303); 
} 

kommen dann zurück

# proxy.php 

if (!empty($_GET['uri'])) { 
    // maybe some validation here 
    header('Location: '.$_GET['uri'], true, 303); 
} 
0

Proxy-Umleitung auf Skript versuchen Wenn ein Benutzer versucht, die Seiten wiederherzustellen, die unerwartet heruntergefahren worden, dann zeigt der Browser den Fehler 'err_cache_miss' an. Sehen Sie das Video Beweis für Hauptquelle des Fehlers https://www.youtube.com/watch?v=6c9ztzqlthE

-1

dies wird Ihnen helfen, mehr bessere Weise dies nur in einer Datei setzen, die alle Dateien

header("Cache-Control: no-cache, must-revalidate"); 

wenn nicht, dann versuchen, diese

schließen
session_cache_limiter('private, must-revalidate'); 
session_cache_expire(60); 
Verwandte Themen