Редактировать: Прошло несколько лет с тех пор, как я первоначально разместил этот ответ, и, хотя я получил несколько голосов, я не очень доволен своим предыдущим ответом, поэтому я переделал его полностью.Надеюсь, это поможет.
Когда использовать GET
и POST
:
Один из способов избавиться от этого сообщения об ошибке - заставить вашу форму использовать GET
вместо POST
.Просто помните, что это не всегда подходящее решение (читайте ниже).
Всегда используйте POST , если вы выполняете действие, которое вам не нужнодля повторения, если конфиденциальная информация передается или если ваша форма содержит либо загруженный файл, либо длина всех отправленных данных превышает ~ 2000 символов .
Примеры использованияPOST
будет включать в себя:
- Форма входа
- Форма контакта
- Форма отправки платежа
- Что-то, что добавляет, редактирует или удаляетзаписи из базы данных
- Загрузчик изображений (обратите внимание, что при использовании
GET
с полем <input type="file">
на сервер будет отправлено только имя файла, что в 99,73% времени не соответствует желаемому.) - Форма со многими полями (которая создаст длинный URL при использовании GET)
В любом из этих случаев вам не нужно, чтобы люди обновляли страницу и повторноотправка данных.Если вы отправляете конфиденциальную информацию, использование GET будет не только неуместным, это будет проблемой безопасности (, даже если форма отправляется AJAX ), поскольку конфиденциальный элемент (например, пароль пользователя) отправляется вURL и, следовательно, будет отображаться в журналах доступа к серверу.
Используйте GET в основном для всего остального.Это означает, что когда вы не возражаете, если это повторяется, для всего, на что вы могли бы предоставить прямую ссылку, когда не передается конфиденциальная информация, когда вы почти уверены, что длина ваших URL не выйдет из-под контроля икогда ваши формы не имеют файлов для загрузки.
Примеры могут включать:
- Выполнение поиска в поисковой системе
- Форма навигации для навигации повеб-сайт
- Выполнение одноразовых действий с использованием одноразового или одноразового пароля (например, ссылки «отписаться» в электронном письме).
В этих случаях POST будет совершенно неуместным.Представьте, что поисковые системы используют POST для своих поисков.Вы будете получать это сообщение каждый раз, когда обновляете страницу, и вы не сможете просто скопировать и вставить URL-адрес результатов людям, им придется вручную заполнять форму.
Если вы используете POST
:
Мне кажется, что в большинстве случаев даже всплывающее диалоговое окно «Подтверждение повторной отправки формы» показывает, что существует недостаток дизайна.По самой природе POST
, используемой для выполнения разрушительных действий, веб-дизайнеры должны препятствовать тому, чтобы пользователи когда-либо выполняли их более одного раза, случайно (или намеренно) обновляя страницу.Многие пользователи даже не знают, что означает этот диалог, и поэтому просто нажимают «Продолжить».Что, если это было после запроса «отправить платеж»?Оплата отправляется снова?
Так что вы делаете?К счастью, у нас есть шаблон проектирования Post / Redirect / Get .Пользователь отправляет POST-запрос на сервер, сервер перенаправляет браузер пользователя на другую страницу, а затем эта страница извлекается с помощью GET.
Вот простой пример использования PHP:
if(!empty($_POST['username'] && !empty($_POST['password'])) {
$user = new User;
$user->login($_POST['username'], $_POST['password']);
if ($user->isLoggedIn()) {
header("Location: /admin/welcome.php");
exit;
}
else {
header("Location: /login.php?invalid_login");
}
}
Обратите внимание, что в этом примере, даже если пароль неверен , я все еще перенаправляю обратно в форму входа.Чтобы отобразить недопустимое сообщение для входа в систему пользователю, просто сделайте что-то вроде:
if (isset($_GET['invalid_login'])) {
echo "Your username and password combination is invalid";
}