Как кэшировать изображения, динамически генерируемые с помощью PHP?
На сайте я динамически генерирую изображения, используя PHP-расширение ImageMagick. Я использую файл.htaccess для перезаписи файлов, заканчивающихся на.jpg, в файл php для динамической генерации:
RewriteRule ^([^_]+).jpg index.php?filename=$1
Затем я создаю изображения в формате JPG внутри файла PHP:
$img->setImageFormat('jpeg');
Прежде чем повторить изображение, я отправляю следующие заголовки:
header("Content-Type: image/jpeg");
header('Expires: Mon, 26 Jul 2027 05:00:00 GMT');
header("Pragma: cache");
header("Cache-Control: max-age=290304001");
Однако, используя расширение Chrome " Is it Cached? ", Я вижу, что динамически генерируемые изображения не кэшируются. Кроме того, консоль Google Chrome сообщает " Ресурс интерпретируется как Документ, но передается с изображением MIME type / jpeg ", несмотря на то, что заголовок установлен как Content-Type: image/jpeg
,
Поэтому я попытался кэшировать с помощью.htaccess, используя следующее:
<filesMatch "\.(jpg)$">
Header set Cache-Control "max-age=290304001, public"
</filesMatch>
Но это также не сработало.
Поэтому я попытался добавить php
расширение до условия.htaccess:
<filesMatch "\.(jpg|php)$">
Header set Cache-Control "max-age=290304001, public"
</filesMatch>
И это, наконец, сработало, и изображения были кэшированы. Так что я рад, что заставил его работать, но этот метод проб и ошибок оставляет меня непростым, и я не понимаю, почему не работали заголовки кеша PHP.
Вопросы:
1) Является ли кэширование с помощью файла.htaccess правильным способом кеширования изображений, динамически генерируемых с помощью PHP?
2) Почему заголовки кэша, отправляемые PHP, не имеют никакого эффекта?
3) Почему консоль Chrome говорит " Ресурс интерпретируется как Документ, но передается с изображением MIME type / jpeg ", когда заголовок установлен на image/jpeg
?
4) Есть ли лучший способ кэширования динамически генерируемых изображений с помощью PHP (возможно, с использованием чистого PHP без.htaccess)?
1 ответ
Попробуйте добавить заголовок Last-Modified:
header("Last-Modified: Fri, 13 May 2016 13:16:19 GMT");
Формат даты как в RFC2616. Для генерации даты в этом формате вы можете использовать константу \DateTime::RSS, например
echo (new \DateTime())->format(\DateTime::RSS);
или же
echo date(\DateTime::RSS);
Конечно, дата не должна меняться с каждым запросом.
Надеюсь это поможет!