устаревший во время повторной валидации и устаревший-если-ошибка не работают вместе в Squid 2.7, как показано здесь:
http://www.igvita.com/2009/08/05/masking-latency-failures-with-squid/
Кальмар работает со следующей конфигурацией:
http_port 80 accel defaultsite=mydomain.com
cache_peer 127.0.0.1 parent 8000 0 no-query originserver name=main
httpd_suppress_version_string on
header_access Cache-Control deny all
cache_effective_user squid
negative_ttl 5 seconds
И на внутреннем сервере php + apache на порту 8000 я возвращаю это:
<?php
// trigger_error("Throw error 500", E_USER_ERROR");
header('Cache-Control: max-age=10, stale-while-revalidate=20 stale-if-error=20');
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
sleep(2);
die("OK");
Когда я раскомментирую trigger_error, если я отправляю устаревший во время повторной валидации тогда клиент получает ошибку, если я отправлю следующую, устаревшая, если ошибка работает, как ожидалось:
<?php
trigger_error("Throw error 500", E_USER_ERROR");
header('Cache-Control: max-age=10, stale-if-error=20');
// Next one don't works
// header('Cache-Control: max-age=10, stale-while-revalidate=20 stale-if-error=20');
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
sleep(2);
die("OK");
Ошибка появилась после squid-2.7-stable7 (включительно). Я добавил ошибку в squid bugzilla по следующей ссылке:
http://bugs.squid-cache.org/show_bug.cgi?id=3671
squid-2.7-stable6 работает как положено.