Здесь нужно решить две проблемы.
Во-первых, как браузеры обычно обрабатывают кнопку возврата. Вы должны использовать POST-запрос, чтобы перейти на страницу, к которой у кнопки «Назад» не должно быть доступа. Большинство браузеров используют локальный кеш для запросов GET, поэтому, если вы выполните GET, ваш сервер просто не будет доступен вообще. Однако POST-запрос обычно выполняет новый запрос. Многие браузеры также предупреждают пользователя и отображают диалоговое окно с надписью, т. Е. «Вы уверены, что хотите отправить форму снова?». Таким образом, используя POST, вы увеличиваете вероятность того, что каждая загрузка страницы этой страницы будет выполнять новый запрос на ваш сервер.
Вы также можете использовать запрос GET, когда ваш сервер возвращает HTTP-заголовки, что заставляет браузеры не загружать страницу из кэша. Экспериментируйте с этим.
Вторая проблема - удостовериться, что вы сделали недействительными дубликаты запросов на стороне сервера. Первое решение, которое я могу придумать, - это создать токен, который вы отправляете вместе с формой и сохраняете в базе данных при каждом запросе. Если запрос выполняется с токеном, который уже сохранен, вы можете сделать запрос недействительным. Возможно, есть лучшие методы, но я оставлю это как упражнение для читателя;)