#browser-history #html5-history #post-redirect-get
#история браузера #html5-история #сообщение-перенаправление-получить #post-redirect-get
Вопрос:
У меня есть URL /books
, в котором перечислены некоторые книги, и шаблон URL /books/{some-book-title}
, который показывает форму просмотра / обновления метаданных книги. Вот типичная история пользователя, где пользователь исправляет неверную запись автора:
GET /books
<a href="/books/ulysses">Ulysses</a>
<a href="/books/don-quixote">Don Quixote</a>
GET /books/ulysses
<form action="/books/ulysses" method="post" enctype="application/x-www-form-urlencoded">
<input name="author" value="Jamessss Joycessss">
</form>
POST /books/ulysses FORMDATA author=James Joyce
Redirect 303 SEE OTHER location = /books/ulysses
GET /books/ulysses
<form action="/books/ulysses" method="post" enctype="application/x-www-form-urlencoded">
<input name="author" value="James Joyce">
</form>
Проблема в том, что стек истории теперь
/books
/books/ulysses
/books/ulysses
чтобы, когда пользователь нажимает «назад», он не возвращался к /books
, а просто обновлял текущую страницу. Есть ли способ, отличный от javascript, обработать случай обновления, чтобы кнопка «Назад» имела ожидаемое поведение? И если нет, то каков способ javascript исправить это?
РЕДАКТИРОВАТЬ: еще более запутанно, если вы публикуете несколько раз
GET /books
GET /books/ulysses author=Jamesss Joycesss
POST author=3 -> redirect shows author=3
POST author=2 -> redirect shows author=2
POST author=1 -> redirect shows author=1
Press back button /books/ulysses shows author=1
Press back button /books/ulysses shows author=2 (!!!)
Press back button /books/ulysses shows author=3 (!!!)
Press back button /books
Комментарии:
1. Не знаю, какой фреймворк или систему вы используете, но можете ли вы просто вернуть тот же ответ из POST, что и get, избегая перенаправления?
2. Я специально использую шаблон post-redirect-get. Когда пользователи нажимают кнопку «Назад», я не хочу, чтобы Chrome выдавал им диалоговое окно «повторно отправить данные», и post-redirect-get выполняет эту задачу.
Ответ №1:
Способ изменения поведения кнопки «Назад» на JavaScript заключался бы в использовании API истории
Вот быстрый способ перейти на первую страницу в стеке истории. Просто добавьте прослушиватель событий для кнопки «Назад» и используйте history API.
window.history.go(0);
Взгляните на API :https://developer.mozilla.org/en-US/docs/Web/API/History_API
Комментарии:
1. Но я бы хотел такого поведения только в тех случаях, когда я был перенаправлен на ту же страницу. Есть ли способ узнать, был ли я просто перенаправлен на ту же страницу?
2. Вы можете узнать, проверив код состояния HTTP для этой страницы, он должен быть 30X для перенаправления.