Diciamo che io sono su/pagina? Id = 1post-reindirizzamento-get (PRG) re-inserisce stessa pagina nella storia nei browser Webkit
Poi ci si dirige verso/pagina? Id = 2
E apporto una modifica a quella pagina, che implementa un post e quindi reindirizza a/page? Id = 2
In Firefox, posso premere il pulsante Indietro una volta e tornare a/page? Id = 1, ma in Chrome e Safari su iPhone, devo premere due volte il pulsante Indietro perché/page? id = 2 si trova nella cronologia del browser due volte. (E se avessi fatto più post da id = 2, avrei dovuto premere il pulsante Indietro tante volte per tornare infine a id = 1)
In alcuni casi, questo sembra un normale comportamento del browser, poiché GET viene semplicemente inserito nella cronologia, ma poiché l'URL è identico alla voce precedente, ciò si traduce in una scarsa esperienza utente, che in genere sembra essere evitata da altre applicazioni Web ... ed è naturalmente evitata in Firefox. Si tratta di un bug inevitabile nei browser Webkit o posso implementare il PRG in un modo diverso per evitare questo?
BTW il comportamento sembra essere lo stesso reindirizzamento con 302 o 303.
UPDATE: Ho preso in giro un po 'di codice di esempio ... non so se c'è una piattaforma come jsfiddle dove potrei caricare questo per voi per vedere in azione:
form.php:
id=<?=$_REQUEST['id']?>
<form action="submit.php" method="post">
<input type="hidden" name="id" value="<?=$_REQUEST['id']?>">
<input type="submit" value="submit">
</form>
submit.php:
<?php
header("Location: form.php?id=" . $_REQUEST['id']);
die($_REQUEST['id']);
?>
Se inizio su form.php? Id = 4 (solo per inserirlo nella cronologia del browser) e poi vai a form.php? Id = 5 e poi premi invio (come se per eseguire una modifica del database), in Firefox ottengo una voce nella storia per ciascuno; in Chrome ottengo una voce per id = 4 e quindi due voci per id = 5. Perché la differenza di comportamento? Penso che il comportamento di Firefox sia migliore, dal momento che colpire due volte per scappare da id = 5 è contro-intuitivo per l'utente.
Grazie. Vedo come funziona, ma wow, approccio piuttosto rotonda, che richiede iframe, javascript, ecc. Per un semplice invio di moduli (e sperando che il browser non inquini la sua storia a causa dell'iframe). Sto ancora sperando che qualcuno possa affrontare i meccanismi alla base del comportamento della cronologia dei browser durante il PRG standard in Webkit e vedere se c'è una soluzione più diretta per affrontarlo. – dlo
Grazie per il bel commento. E sì, sarebbe bello avere una spiegazione reale di come funzionano effettivamente i meccanismi. –
Sì, mi sono rovinato una volta quando ho fatto una domanda su Firefox e qualcuno che è in realtà sul team di sviluppo di Firefox ha risposto. :) – dlo