Jump to content
  • 0

Редирект в ответ на пост-запрос


rash
 Share

Question

Пришлось вот столкнуться с серверсайд-программированием (совсем по верхам), и грабли не заставили себя долго ждать. Это не PHP, но в контексте задачи язык не должен иметь значения вообще.

Совершенно очевидно, что в ответ на пост-запрос должен приходить редирект. Запрос обрабатывается той же страницей, с котрой отправляется форма.

Сначала в ответ отправлялся заголовок location с адресом текущей страницы, однако при обновлении страницы все браузеры переотправляют форму заново. То есть такой вариант не работает.

Второй вариант — заголовок refresh с урлом текущей страницы, который проблему решает везде, кроме Fx (IE еще даже не смотрел). То есть Firefox продолжает настойчиво переотправлять форму при обновлении страницы. Пробовал добавлять задержку перед рефрешем (мало ли что) — безуспешно.

Собственно, как принято универсально решать задачу надежного редиректа в ответ на пост, чтобы любой браузер понял, что переотправлять форму не надо?

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

второй вариант это в мета что ли прописывать?

думаю что тут надо с помощью сессий типа того:

if (isset($_SESSION['flag']) && (time()-$_SESSION['flag'] < 15))
{
echo '<h1>Защита от повторного обновления! Нужно подождать 15 сек...</h1>';
}
else
{
тут отправка данных.
echo '<h1>Информация успешно обновлена в базу!</h1>';
$_SESSION['flag']=time();
}

это своего рода защита от повторного автоматического обновления, от авторефреша.

если не изменяет память то этот вариант в свое врямя предложил мне int.

UPD: не посмотрел что это ssi, тут видимо надо на js и с сессией.

Edited by rus
Link to comment
Share on other sites

  • 0

проблема в том, что заголовки очень капризны порой бывают.

сам сталкивался с тем что надо было после выполнения сценария хедером сделать редирект, но он не редиректился ни в какую, хоть ты тресни, так как заголовки были уже посланы.

так и не смог решить эту проблему.

Link to comment
Share on other sites

  • 0
Как вариант погуглите на предмет PRG pattern, хотя может я чего не понял

Все правильно, читаю.

Интересно, познавательно, но пока проблема не решена. Надо разобраться, как отдать 303 статус, наверное.

Link to comment
Share on other sites

  • 0

А если попробовать перенаправить на ту же страницу но с префиксом ?q=234234 где число выдаётся рандомно, тогда получается что вы хоть и попадаете на ну же страничку, но урл уже другой, может не будет перепосылать при обновлении?

Edited by deadrash
Link to comment
Share on other sites

  • 0

Подсказали, в чем дело.

Оказывается, что если урл начинается со слеша, то редирект обрабатывается прозрачно на сервере, браузер никакого редиректа не видит. У меня была как раз эта ситуация.

Link to comment
Share on other sites

  • 0
В смысле? урл всегда начинается со слеша, а точнее с двух слешей после http: или о чём реч?

в смысле если редирект выполняется на урл вида /seciton/article/

без протокола и домена.

Link to comment
Share on other sites

  • 0
в смысле если редирект выполняется на урл вида /seciton/article/

без протокола и домена.

У меня что со слешем, что без него - один фиг отправляет по новой.

Удалось решить следующим скриптом:

if($_SESSION[urlreq] == 0){
$_SESSION[urlreq] = 1;
}

$_SESSION[urlreq] = $_SESSION[urlreq] + 1;
$zaprosUrl = $_SESSION[urlreq] + 1;

if($_SESSION[urlreq] == $_SERVER[QUERY_STRING]){
//Выполняем скрипт формы или чего иного ...
}
else{
if($_SERVER[QUERY_STRING]){
$error="Вы успешно обновили страницу.";
}
}

//далее сама форма
?>
<form method="POST" action="forma.php?<php=$zaprosUrl?>">
<input> ......
<input type="submit" value="Оформить форму">
</form>

Проверял только в ФФоксе если есть возможность проверте в других броузерах. http://fiestakids.jino.ru/

Edited by deadrash
Link to comment
Share on other sites

  • 0
У меня что со слешем, что без него - один фиг отправляет по новой.

Удалось решить следующим скриптом:

if($_SESSION[urlreq] == 0){
$_SESSION[urlreq] = 1;
}

$_SESSION[urlreq] = $_SESSION[urlreq] + 1;
$zaprosUrl = $_SESSION[urlreq] + 1;

if($_SESSION[urlreq] == $_SERVER[QUERY_STRING]){
//Выполняем скрипт формы или чего иного ...
}
else{
if($_SERVER[QUERY_STRING]){
$error="Вы успешно обновили страницу.";
}
}

//далее сама форма
?>
<form method="POST" action="calc.php?<php=$zaprosUrl?>">
<input> ......
<input type="submit" value="Оформить форму">
</form>

Проверял только в ФФоксе если есть возможность проверте в других броузерах. http://fiestakids.jino.ru/

Да я решил свою проблему уже :)

Может даже от настроек конкретного сервера зависит. Мне, вроде, помог редирект на ./

Link to comment
Share on other sites

  • 0

В интернете не удалось нарыть решения проблемы, а так-как на этот форум часто заходят новички, решил привести код в приличный вид.

Если используется метод запроса типа POST:

<?php
if($_SESSION[urlreq] == $_POST[checkRefresh]){ //Делаем проверку прислали форму или просто обновили страницу
//Тут будет выполняться наш код в случае если форму прислали
}
else{ //Иначе выпишем ошибку.
if($_POST[checkRefresh]){ //Если форма загрузилась первый раз переменная будет пустая.
$error="Вы успешно обновили страницу."; //Закатаем её в переменную еррор
}
}

$_SESSION[urlreq] += 1; //Переменная для проверки обновления страницы, обновляется при каждом чтении скрипта.

?>
<form method="POST" action="forma.php">
<input type="hidden" name="checkRefresh" value="<?=$_SESSION[urlreq]?>" >
<input type="submit" value="Оформить форму" >
</form>

Если используется метод запроса типа GET:

<?php
if($_SESSION[urlreq] == $_GET[checkRefresh]){ //Делаем проверку прислали форму или просто обновили страницу
//Тут будет выполняться наш код в случае если форму прислали
}
else{ //Иначе выпишем ошибку.
if($_GET[checkRefresh]){ //Если форма загрузилась первый раз переменная будет пустая.
$error="Вы успешно обновили страницу."; //Закатаем её в переменную еррор
}
}

$_SESSION[urlreq] += 1; //Переменная для проверки обновления страницы, обновляется при каждом чтении скрипта.

?>
<form method="GET" action="forma.php">
<input type="hidden" name="checkRefresh" value="<?=$_SESSION[urlreq]?>" >
<input type="submit" value="Оформить форму" >
</form>

Подразумевается что выполнение скрипта проходит при открытой сессии.

Надеюсь ничего не перепутал ))

Edited by deadrash
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy