Я далеко не эксперт, но ...
В отношении этого:
«Условный запрос If-Modified-Since вернул весь контент без изменений.»
и мои комментарии.
Код, используемый для создания миниатюр, должен проверять следующее:
- Есть ли кэшированная версия миниатюры.
- Является ли кэшированная версия более новой, чем исходное изображение.
Если любой из них ложный, миниатюра должна быть сгенерирована и возвращена, несмотря ни на что. Если они оба верны, то следует выполнить следующую проверку:
- Есть ли заголовок HTTP_IF_MODIFIED_SINCE
- Время последнего изменения в кэшированной версии совпадает с HTTP_IF_MODIFIED_SINCE
Если любое из этих значений неверно, должен быть возвращен кешированный эскиз.
Если оба они верны, то должен быть возвращен статус 304 http. Я не уверен, требуется ли это, но я также лично возвращаю заголовки Cache-Control, Expires и Last-Modified вместе с 304.
Что касается GZipping, мне сообщили, что нет необходимости в GZip изображениях, поэтому игнорируйте эту часть моего комментария.
Редактировать: я не заметил вашего добавления в ваш пост.
session_cache_limiter('public');
header("Content-type: " . $this->_mime);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
// I'm sure Last-Modified should be a static value. not dynamic as you have it here.
header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() - 404800000) . " GMT");
Я также уверен, что ваш код должен проверить заголовок HTTP_IF_MODIFIED_SINCE и отреагировать на него. Простая установка этих заголовков и вашего файла .htaccess не даст требуемого результата.
Я думаю, вам нужно что-то вроде этого:
$date = 'D, d M Y H:i:s T'; // DATE_RFC850
$modified = filemtime($filename);
$expires = strtotime('1 year'); // 1 Year
header(sprintf('Cache-Control: %s, max-age=%s', 'public', $expires - time()));
header(sprintf('Expires: %s', date($date, $expires)));
header(sprintf('Last-Modified: %s', date($date, $modified)));
header(sprintf('Content-Type: %s', $mime));
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) {
header('HTTP/1.1 304 Not Modified', true, 304);
// Should have been an exit not a return. After sending the not modified http
// code, the script should end and return no content.
exit();
}
}
// Render image data