Сломанная история для самообновляющейся формы с использованием 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

person Ned Twigg    schedule 13.03.2019    source источник
comment
Не знаю, какую структуру или систему вы используете, но можете ли вы просто вернуть тот же ответ от POST, что и get, избегая перенаправления?   -  person jgoday    schedule 23.03.2019
comment
Я специально использую шаблон post-redirect-get. Когда пользователи нажимают кнопку «Назад», я не хочу, чтобы Chrome давал им диалоговое окно повторной отправки данных, и post-redirect-get выполняет это.   -  person Ned Twigg    schedule 23.03.2019


Ответы (1)


Способ JavaScript изменить поведение кнопки «Назад» — использовать API history.

Вот быстрый способ перейти на первую страницу в стеке истории. Просто добавьте прослушиватель событий для кнопки «Назад» и используйте API истории.

window.history.go(0);

Взгляните на API: https://developer.mozilla.org/en-US/docs/Web/API/History_API

person Divvya Mehta    schedule 23.03.2019
comment
Но я бы хотел такого поведения только в тех случаях, когда меня перенаправили на ту же страницу. Есть ли способ узнать, был ли я просто перенаправлен на ту же страницу? - person Ned Twigg; 24.03.2019
comment
Вы можете узнать, проверив код состояния HTTP для этой страницы, он должен быть 30X для перенаправления. - person Divvya Mehta; 24.03.2019