Запрет кэширования на уровне HTTP

korpus

злой бобёр
В процессе создания капчи для HTML-формы встал вопрос о запрете кэширования капчи браузером. Нужно запретить кэшировать капчу.
В этой статье даётся образец заголовков, способных решить проблему кэширования:
PHP:
 <?php
  /*
  ** Правильный запрет кэширования 
  */
  header("Cache-Control: no-store"); 
  header("Expires: " .  date("r"));
  echo "<h1>",  date("H:i:s"), "</h1>";
  ?>
Мною проверено и этот код хорошо работает для следующих браузеров: IE6, IE7, Firefox3.5, GoogleChrome. Но для браузеров Firefox9, Opera (все версии) и Safari5.1.2 эти заголовки не дают желаемого запрета кэширования, к сожалению. Перепробовал различные комбинации распространённых HTTP-заголовков, таких как Last-Modified, Pragma и прочие, но так и не смог найти решения, пригодного абсолютно для всех браузеров.
Правда я не пробовал заголовок ETag. Он, вероятно, тоже может влиять на кэширование браузеров.
Помогите найти правильные HTTP-заголовки, универсальные и годные для всех браузеров.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Etag кстати работает корректно почти везде.
Ну и ?nocache=Math.random() еще никто не отменил, который вообще везде работает.
 

korpus

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

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

Замечу, что на Opera и Safari вообще ничего не действует. Поэтому хочется найти решение именно для них.
 

korpus

злой бобёр
PHP:
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); 
header("Expires: " .  date("r"));
echo "<h1>",  date("H:i:s"), "</h1>";
Такой код решил проблему для Firefox 9. Для Opera и Safari по прежнему есть кэширование.
Наличие других HTTP-заголовков, указанных Beavis, проблему не решает
 

korpus

злой бобёр
Не понимаю, в каких случаях может не удастся применить rand()?
Есть страница, генерирующая HTML-форму. В HTML-форме выводится рисунок с капчей. Если эта страница будет кэшироваться, то соответственно и рисунок с капчей выведется старый. А к тому времени все переменные в сессиях уже будут изменены. Вот это тот случай.
И вообще хотелось бы иметь работающее решение для запрета кэширования на готове. Большинство решений, находящихся в Интернете, не работают.
 

workOnFood

Новичок
Можно подтягивать рисунок капчи аяксом. Полюбому там должна быть кнопочка обновить рисунок.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Есть страница, генерирующая HTML-форму. В HTML-форме выводится рисунок с капчей. Если эта страница будет кэшироваться, то соответственно и рисунок с капчей выведется старый.
Я не случайно изначально написал Math.random()
 

korpus

злой бобёр
Название темы "Запрет кэширования на уровне HTTP". Это теоретический вопрос, который наверняка кому-нибудь нужен на практике. Мне вот нужен. Интересует, как реализовать запрет кэширования для браузера с помощью HTTP-заголовков. Зачем мне ваш AJAX и Math.random()?
 

korpus

злой бобёр
Смотрите статью, где проблема объяснена: nomagic.ru/all.php?aid=58
 

флоппик

promotor fidei
Команда форума
Партнер клуба
На практике подставление в ссылку случайного значения гарантированно работает везде и всегда. А теоретизирование — не работает.
 

korpus

злой бобёр
В RFC2616 указано, что кнопка "BACK" в браузерах не относится к кэширующему механизму. Так что может для Opera и Safari такое поведение изменить невозможно.
 

stopkran

Дилетант
Да я не против :) Вы автор, вам виднее. Я только хотел сказать, что связи нет: кэширование страницы никак не влияет на обновление картинки.
 

alekciy

Новичок
В процессе создания капчи для HTML-формы встал вопрос о запрете кэширования капчи браузером. Нужно запретить кэшировать капчу.
В этой статье даётся образец заголовков, способных решить проблему кэширования:
PHP:
 <?php
  /*
  ** Правильный запрет кэширования 
  */
  header("Cache-Control: no-store"); 
  header("Expires: " .  date("r"));
  echo "<h1>",  date("H:i:s"), "</h1>";
  ?>
Мною проверено и этот код хорошо работает для следующих браузеров: IE6, IE7, Firefox3.5, GoogleChrome. Но для браузеров Firefox9, Opera (все версии)
Opera 11.61 на Windows XP, указанный код не кэшируется. Что я делаю не так?
 

alekciy

Новичок
Вы не правы. Оба должны быть не кэшируемыми.
Он говорит о том, что даже если сама страница будет кэшироваться, браузер все равно будет делать HTTP запрос на картинку. Будет ли эта картинка так же кэшируемая или нет зависит от того, каких заголовков наставишь.

Только сейчас проверил. index.php:
PHP:
<?php
$content = '<h1>' . date('H:i:s') . '</h1> <img src="captcha.php?v=' . rand(1,99999) . '" />';
header('HTTP/1.1 304 Not Modified');
header('Content-Length: ' . strlen($content));
header('Content-Type: text/html; charset=utf-8');
header('Date: Sun, 19 Feb 2012 05:08:32 GMT');
header('Last-Modified: Sat, 08 Oct 2011 19:41:02 GMT');
echo $content;
Кэшируется, но при этом captcha.php:
PHP:
<?php
file_put_contents('/tmp/ou_5', "+1\n", FILE_APPEND);
Нет. Что видно при каждом обновлении index.php и появляющихся при этом +1 в ou_5 файле.
 
Сверху