Результаты поиска и кнопка «Назад» / HTML-формы - PullRequest
2 голосов
/ 14 декабря 2009

Я ищу решение повторяющейся проблемы с результатами поиска по форме в моем приложении.

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

Однако, когда пользователь нажимает на отдельную запись в наборе результатов, а затем нажимает «Назад» в браузере, браузер спрашивает (Firefox):

"Для отображения этой страницы Firefox должен отправить информацию, которая будет повторять любой действие (например, поиск или заказ подтверждение), которое было выполнено ранее. "

Например, форма для поиска в коллекции DVD, пользователь ищет по годам, нажимает на отдельный фильм. Когда пользователь щелкает обратно на страницу результатов поиска, я не хочу, чтобы ему приходилось повторно отправлять / отправлять данные этой формы.

Так у кого-нибудь есть идеи, как обойти это?

Чтобы дать вам больше информации, я использую метод POST для отправки формы и использую следующие заголовки, чтобы браузер не кэшировал страницу.

Header('Pragma: no-cache');
Header("Cache-control: private, no-cache, no-store");
Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");.

Поскольку большая часть сайта защищена паролем, я не хочу, чтобы сторона, защищенная паролем, кэшировалась и могла быть восстановлена ​​после входа в систему.

По сути, каков наилучший способ избежать такого поведения браузера и в чем причина? Является ли no-cache виновником? Должен ли я указать время истечения пары минут в будущем от загрузки страницы на странице результатов поиска?

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

Ответы [ 4 ]

5 голосов
/ 14 декабря 2009

Ваш браузер делает это, потому что, когда пользователь нажимает «назад», браузер должен снова опубликовать данные, чтобы перезагрузить страницу. Одним из способов решения этой проблемы является использование запроса GET вместо POST. В запросе GET данные формы включаются / кодируются в фактический URL.

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

P.S. Использование запроса GET дает большое преимущество, поскольку ваши страницы результатов поиска будут добавлены в закладки.

Редактировать: есть хорошая информация о формах, запросах POST / GET и различиях между ними здесь , включая информацию о шаблоне «Redirect after Post», который решает эту проблему.

0 голосов
/ 14 декабря 2009

Это не имеет ничего общего с PHP.

Если вы используете кнопку «Назад», чтобы вернуться на любую страницу, которая выполнила POST попросит выполнить этот POST снова.

Причина, по которой это не происходит с GET, заключается в том, что информация GET в URL.

0 голосов
/ 14 декабря 2009

Есть два способа предотвратить это поведение.

  1. Изменить метод формы с POST получить. Это закодирует запрос в URL и удалите эту кнопку назад поведение. FWIW, это то, что Google делает для их поиска.
  2. Найдите способ кешировать результаты поиска (скажем, с данными сеанса или Memcache), и перенаправить их на другая страница, которая будет иметь доступ к кэшированный результат, используя 302 Redirect заголовок.
0 голосов
/ 14 декабря 2009

Для информации о поиске вы можете использовать GET вместо POST. Это сохраняет данные формы в URL. Ваша проблема вызвана тем, что данные POST необходимо отправить повторно, когда пользователь щелкает обратно.

...