LINUX.ORG.RU

Борьба с браузерами.


0

0

Есть некий скрипт, например page.[php|py|чё\-угодно] в ней есть форма, которую заполняет пользователь, и отправка идёт снова в этот самый скрипт. Получив и обработав POST, скрипт отвечает браузеру Location: page.php Подозреваю, что вопрос совсем простой, но как-то не могу найти ответа. Можно ли браузеру доложить, что все данные уже успешно обработаны и снова совать этот пост совершенно незачем?

А разве, например, 301-й редирект на страницу "Бинго!" не будет сам по себе говорить, что все данные приняты и обработаны?

saluki
()

Данные успешно обработаны! <br> <a href='page.php'>Далее</a>
<meta http-equiv='refresh' content='3;url=page.php'>

xorik ★★★★★
()
Ответ на: комментарий от xorik

[qoute]meta http-equiv='refresh' Гхм, посмотрю, спасибо.

devinull ★★
() автор топика
Ответ на: комментарий от xorik

Да, хороший способ, спасибо! Огорчает только, что если указывать 0, то браузер всё-таки рвётся снова отправить данные, а если не ноль - то всё ok. Спасибо!

devinull ★★
() автор топика
Ответ на: комментарий от devinull

А стоп, я не так исходный вопрос понял. Я думал надо пользователю показать, что данные обработаны, а не браузеру. А чем Location не нравится тогда? При нем данные заново не посылаются

xorik ★★★★★
()
Ответ на: комментарий от xorik

Посылаются ещё как, постоянно вываливается вопрос «надо ли переслать данные повторно?».

А с refresh пока получается, что всё зависит от времени показа странички. Пока нащупал, что у меня через три секунды POST не пересылается, меньше - пересылается.

devinull ★★
() автор топика
Ответ на: комментарий от xorik

То есть, если сделать Location: page.php и на ней пользователь нажмёт F5, браузер предлагает отправку данных заново.

devinull ★★
() автор топика
Ответ на: комментарий от devinull

Вот например от хрома:

Подтвердите повторную отправку формы.

На странице, которую вы ищете, использовалась введенная вами информация. При возврате на эту страницу может потребоваться повторить выполненные ранее действия. Продолжить?

Причём, если нажать на отмену, он страницу обновлять не будет.

devinull ★★
() автор топика
Ответ на: комментарий от devinull

Ничего подобного. Нажимаешь F5 и он снова показавыет тебе страницу "Бинго!" на которую был 301-й редирект после успешной обработки данных. Кстати, можешь отследить заголовки при постинге на ЛОРе. Тут эта проблема решена.

saluki
()
Ответ на: комментарий от saluki

Ничего подобного.

Постом выше посмотри.

devinull ★★
() автор топика
Ответ на: комментарий от devinull

Посылаются ещё как

Что то ты обманываешь :) По твоему тут будет бесконечный цикл, если в Location передаются POST данные:

<?
	if( $_POST["a"] )
	{
		header( "Location: test.php" );
		die;
	}
?>
<form method='post'>
	<input type='text' name='a'>
</form>

xorik ★★★★★
()
Ответ на: комментарий от xorik

И по F5 никакого запроса не выходит, потому что пост-данных не было после location. То же касается meta refresh даже с 0-задержкой. Не знаю откуда у тебя пост-данные возникли :)

xorik ★★★★★
()
Ответ на: комментарий от xorik

Хватит уже спорить. Специально для тебя повторяю:

Вот например от хрома:

Подтвердите повторную отправку формы.

На странице, которую вы ищете, использовалась введенная вами информация. При возврате на эту страницу может потребоваться повторить выполненные ранее действия. Продолжить?

Причём, если нажать на отмену, он страницу обновлять не будет.

devinull ★★
() автор топика
Ответ на: комментарий от devinull

>Хватит уже спорить.
Ну ты же неправ :)

Включил свой пример http://www.linux.org.ru/jump-message.jsp?msgid=4214174&cid=4214469 в хроме, ввел POST-данные, потом хром перешел по Location. После этого жму F5 и никакой таблички не вылазит! Если не веришь сейчас залью этот test.php на какой-нибудь сайт

xorik ★★★★★
()
Ответ на: комментарий от devinull

> Ща матюгаться буду ;) У меня эта табличка вылазит!

Полный код предоставь. Пока у тебя чего ещё не вылезло :-).

saluki
()
Ответ на: комментарий от xorik

После header( «Location: page.php» ), а потом F5?

Ну да, ты думаешь, я этот диалог сам придумал что ли? Хотя воспроизводится нестабильно. ;(

devinull ★★
() автор топика
Ответ на: комментарий от devinull

>> После header( "Location: page.php" ), а потом F5?

> Ну да, ты думаешь, я этот диалог сам придумал что ли? Хотя воспроизводится нестабильно. ;(

А после header( "Location: page.php" ) не забываешь die поставить?

А то если при 301-м коде после заголовков будут идти какие-то данные, то редиректа не состоится. И будет ровно то, что ты описываешь.

saluki
()
Ответ на: комментарий от saluki

>А после header( "Location: page.php" ) не забываешь die поставить?
>А то если при 301-м коде после заголовков будут идти какие-то данные, то редиректа не состоится.


Прекрасно состоится :) При получении Location:, браузер игнорирует контент.

KRoN73 ★★★★★
()
Ответ на: комментарий от saluki

>Мне кажется или он просто троллит?

Или троллит, или тупит где-то.

KRoN73 ★★★★★
()

Переадресовывай на другую страницу ("ваш запрос принят") и забудь про эту проблему.

anonymous
()
Ответ на: комментарий от xorik

> Точно? Буду знать :)

Не точно. Предлагаю проверить самостоятельно. Не все это делают. Да и вообще, надеяться в этов вопросе на браузер я бы не рискнула.

saluki
()
Ответ на: комментарий от devinull

А вот с meta http-equiv='refresh' воспроизводится стабильно. Если указать 0 или 1 сек, предлагает повторную отправку всегда. Это так и должно быть?

devinull ★★
() автор топика
Ответ на: комментарий от saluki

>Не точно. Предлагаю проверить самостоятельно. Не все это делают

В RFC оговорено однозначно. Получив такой заголовок, браузер должен осуществить переход по указанному адресу. Всё. Про контент не говорится вообще. Значит, если браузер, получив header Location: и контент после него, не осуществляет переход - он не выполняет RFC 2616.

...

И таких браузеров я не встречал пока. Встретишь - дай целеуказание, проверю :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.