Боремся с сообщением о повторной отправке формы
Итак, однажды я встраивал на сайт одну хитрую форму, состоящую из нескольких шагов. Если в этой форме заполнить не все обязательные поля, то будет выведено сообщение об ошибке и просьба нажать в браузере «назад
» и заполнить-таки необходимые поля. Вот такое странное представление о юзабилити. Нехитрая команда «назад
» прекрасно выполнялась на старом месте жительства формы, а вот на новом сайте (на битриксе), она вызывала подозрительное окошко вот такого вида:
-
в Firefox:
-
в Chrom'е
-
в IE это целый трактат
-
и только Opera искренне заботится о нервах пользователя и послушно грузит страницу из кэша, не задавая никаких лишних вопросов.
Что ж, давайте разбираться.
Из описания ошибки в FF и Chrome'е становится ясно, что возникает она при отправке формы. Если быть точнее, то ошибка возникает, если мы пытаемся вернуться на страницу, на которую изначально попали, используя post-запрос. Чтобы было понятнее, я нарисовал картинку:
А теперь самый интересный вопрос: почему ошибка возникает не всегда? Как я писал выше, на старом сайте можно было вернуться назад без всяких дурацких сообщений про повторную отправку. С подачи моего коллеги Антона, было установлено, что во всём виновато кэширование, а точнее, заголовки, регламентирующие кэширование в браузере. Оказывается, если заголовками запрещается кэширование страницы, и переход на неё изначально был сделан post-запросом, то просто так вернуться на неё уже не получится. Дальнейшие эксперименты показали, что во всём виноват один заголовок Cache-Control
. Чтобы исправить ситуацию, достаточно просто убрать этот его.
Если вы, как и я, не властны над кодом, генерируемым CMS, то удалить этот заголовок нам поможет волшебный .htaccess
. Файл со следующим содержимым надо положить в ту папку, где находится проблемная страница:
<ifModule mod_headers.c>
Header unset Cache-Control
</ifModule>
Вся эта фигня приведёт к тому, что все браузеры будут вести себя подобно Opera — они будут возвращаться на предыдущую страницу, не делая запрос на сервер, а беря содержимое из кэша. Плохо это или хорошо — решайте сами.
Уф... я написал столько текста ради одной строчки в .htaccess
, надо бы приучить себя к лаконичности.
Не лучше ли приблизить конфиг локального сервера к боевому, например, с помощью VMware? Вдруг там модуль есть и проблема не возникнет...