Как кэшировать изображения, динамически генерируемые с помощью 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);

Конечно, дата не должна меняться с каждым запросом.

Надеюсь это поможет!

Другие вопросы по тегам