Ctrl + R в Firefox для обновления страницы и моего PHP-кода - PullRequest
2 голосов
/ 24 марта 2010

Я создал форму (это гибридный код PHP и HTML). у него есть возможность отправить '$ _POST'. И когда я нажимаю на него, он отлично работает при отправке и отображении ввода.

Но что-то происходит, когда я нажимаю Ctrl + R в Firefox для обновления страницы. Я получил это диалоговое окно подтверждения: « Чтобы отобразить эту страницу, Firefox должен отправить информацию, которая будет повторять любое действие (например, поиск или подтверждение заказа), которое было выполнено ранее »

мой вопрос

  1. что это, (это диалог подтверждения?)
  2. что мне делать с моим кодом, чтобы он мог подавить это диалоговое окно?

Ответы [ 4 ]

6 голосов
/ 24 марта 2010

Вы, вероятно, создали страницу HTML, которая содержит <form>. Форма используется для отправки данных на HTTP-сервер (то есть веб-сервер, на котором размещен ваш сайт).

Протокол HTTP определяет различные типы запросов, используемые для отправки данных на сервер и для получения данных с сервера. Наиболее используемыми являются GET и POST. Вы должны узнать обо всем этом, если хотите быть чем-то большим, чем очень плохим программистом PHP, что, к сожалению (или, к счастью, если вы на стороне хакера), очень распространено.

Ваша проблема в том, что Firefox появился на странице, о которой вы говорите, после отправки запроса POST. Если вы перезагрузите страницу, она должна снова отправить те же данные в форме POST. Из-за соглашений о том, для чего должен использоваться запрос POST (обычно для изменения данных в базе данных), браузер спрашивает пользователя, уверен ли он в том, что он хочет сделать.

В основном есть два способа обойти это:

  1. Изменить метод формы на GET; или
  2. Использовать перенаправление после POST.

Чтобы использовать первый метод, вы можете просто добавить параметр method="get" в тег формы:

<form action="senddata.php" method="get"> ... </form>

Чтобы использовать второй метод, вы просто перенаправляете пользователя после запроса POST, используя что-то вроде

header("Location: blahblahblah")

Наиболее часто используемый шаблон - это POST-Redirect, то есть второй метод, о котором я вам говорил. Есть много последствий для безопасности при использовании GET для изменения данных в базе данных (если вас это интересует, , и вам следует, как и каждому программисту PHP , прочитать о XSRF ).

3 голосов
/ 24 марта 2010

Отправка формы (отправка запроса POST) обычно используется для подтверждения заказа на сайтах электронной коммерции. Поэтому, отправив его дважды, вы отправите заказ дважды. Поэтому браузеры, как правило, запрашивают подтверждение того, что пользователь хочет отправить запрос POST снова.

Чтобы предотвратить это, вам нужно сделать так, чтобы обновление выполняло запрос GET вместо запроса POST. Для этого просто перенаправьте на ту же страницу после обработки формы.

header("Location: /path/to/self");

Это сделает так, что когда пользователь нажмет на обновление, он будет отправлять запрос GET вместо запроса POST и не будет запрашивать подтверждение.


Чтобы царапать, это выглядит так:

  • Форма отправляется по почте (пользователь нажимает на форму)
  • Форма обрабатывается
  • Пользователь перенаправляется на ту же страницу (через GET)
  • Теперь пользователь будет обновлять запрос GET вместо запроса POST.
2 голосов
/ 24 марта 2010

Я предполагаю, что когда ваша форма (php, asps, static html и т. Д.) Содержит информацию о публикации, которая может формировать поле информации или другое, отправляется на сервер через firefox, она отображает такое сообщение перед отправкой данных на сервер снова. он служит защитой от разработчиков Mozilla. Я думаю, это можно отключить с помощью about: config, но это не рекомендуется.

Также это нормальное поведение. Так должно быть и так было довольно долго в Firefox.

Вы можете посмотреть здесь: http://forums.mozillazine.org/viewtopic.php?f=38&t=682835&st=0&sk=t&sd=a&hilit=Firefox+must+send

альтернативно используйте GET вместо POST для отправки ваших данных ...

Привет

0 голосов
/ 24 марта 2010

Если форма была успешно отправлена, ответьте с кодом состояния 303 :

header('Location: http://www.example.com/', TRUE, 303);

Это заставит браузер использовать запрос GET для полученной страницы.Повторная загрузка не отправляет данные POST, и всплывающее окно не отображается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...