У меня есть форма, отправляется с помощью POST.
После обработки формы делается redirect на страницу, в которой указано успешно или нет прошла транзакция.
GET /form.php -> POST /process.php, Location (succ.php || fail.php) -> GET /succ.php || /fail.php
Проблема в следующем, некоторые клиенты (или браузеры) не выполняют GET, который должен быть выполнен после Location.
код выглядит примерно так
form.php:
<form method="POST" action="/process.php">
<input type="text" name="var" value="some text" />
<input type="submit" />
</form>
process.php:
<?php
if ($_POST['var'] == 'password') {
header('HTTP/1.1 303 See Other');
header("Location: http://myhost.org/succ.php");
} else {
header('HTTP/1.1 303 See Other');
header("Location: http://myhost.org/fail.php");
}
?>
succ.php:
All ok
fail.php:
something wrong
Спустя 39 минут, 37 секунд (18.11.2009 - 16:06) twin написал(а):
Ошибка в том, что не нужно усложнять себе жизнь. Вот ты где то начитался умных терминов, а механизма так и не понял.
Попробуй описать проблему своими словами, не умничая. И наверняка сам пойменшь гораздо больше, чем понял я из твоего вопроса.
Попробуй описать проблему своими словами, не умничая. И наверняка сам пойменшь гораздо больше, чем понял я из твоего вопроса.
Спустя 46 минут, 55 секунд (18.11.2009 - 16:53) braintest написал(а):
Вы предлагаете не делать редирект после обработки POST?
Спустя 7 минут, 33 секунды (18.11.2009 - 17:01) Gabriel написал(а):
<?php
header("Status: 200");
header("Location: /succ.php");
exit;
?>
а так чего некатит?
Спустя 42 минуты, 11 секунд (18.11.2009 - 17:43) braintest написал(а):
Ещё небольшое уточнение.
process.php может выполняться несколько секунд от 3 до 7.
Прокатывает и мой вариант и Ваш.
Я говорю о том случае, когда у десяти работает, а у одиннадцатого нет.
Возможен вариант, когда пользователь нажимает stop.
Я пробовал установить ignore_user_abort(true), а потом проверять connection_aborted(), но она всегда возвращает 0.
process.php может выполняться несколько секунд от 3 до 7.
Прокатывает и мой вариант и Ваш.
Я говорю о том случае, когда у десяти работает, а у одиннадцатого нет.
Возможен вариант, когда пользователь нажимает stop.
Я пробовал установить ignore_user_abort(true), а потом проверять connection_aborted(), но она всегда возвращает 0.
Спустя 7 минут, 35 секунд (18.11.2009 - 17:51) krasilich написал(а):
Цитата |
process.php может выполняться несколько секунд от 3 до 7. |
Чисто визуальное наблюдение, или замер с помощью microtime()?
Цитата |
Я говорю о том случае, когда у десяти работает, а у одиннадцатого нет. |
Не работает редирект? А если не отправлять код ответа вообще, а только Location?
Цитата |
Проблема в следующем, некоторые клиенты (или браузеры) не выполняют GET, который должен быть выполнен после Location. |
Какой еще GET, где он в том примере, что Вы привели?
Спустя 3 минуты, 13 секунд (18.11.2009 - 17:54) Gabriel написал(а):
see_man
Цитата |
Не работает редирект? А если не отправлять код ответа вообще, а только Location? |
ага небудем посылать статусы и запретим входы с хрома

Спустя 9 месяцев, 8 дней, 23 часа, 43 минуты, 6 секунд (27.08.2010 - 16:37) braintest написал(а):
Проблема найдена и решена.
Моё предположение, о том, что браузер не выполняет редирект оказалось правильным.
Вероятно, пользователь таки нажимает стоп или что-то подобное.
и пытается выбрать предыдущую страницу.
Я обработал эту ситуацию так:
Если транзакция с банком уже была, то я сразу перенаправляю его на соответствующую страницу.
За прошедшие пол-года больше проблем не возникало.
Моё предположение, о том, что браузер не выполняет редирект оказалось правильным.
Вероятно, пользователь таки нажимает стоп или что-то подобное.
и пытается выбрать предыдущую страницу.
Я обработал эту ситуацию так:
Если транзакция с банком уже была, то я сразу перенаправляю его на соответствующую страницу.
За прошедшие пол-года больше проблем не возникало.