Стоит ли добавлять md5-строку в URL-адреса изображений?

Я динамически генерирую страницу с помощью PHP. Я использую выходную строку сайта для создания Etag и проверяю, чтобы отправить 304 (не изменено), когда сайт не изменился с момента последнего запроса.

Сейчас я также пытаюсь улучшить кэширование изображений на своем сайте. На каждом сайте размещено от 6 до 30 изображений (jpg, 70 - 200 КБ). Я хочу, чтобы пользователь перезагрузил изображение, если его содержимое изменилось. Я думаю об этом, добавив строку запроса к URL-адресу каждого изображения:

src="'.$files[$x].'?id='.md5_file($files[$x]).'"

Это слишком сложно и создает слишком большую нагрузку на каждый запрос или оно того стоит? Как я уже сказал: я генерирую эти md5-хэши для каждого изображения, а затем один md5-хеш для выходной строки, чтобы использовать его в качестве Etag для каждого запроса.

Это заголовки ответов из моих изображений:

HTTP/1.1 304 Not Modified
Date: Mon, 10 Dec 2012 08:56:49 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=99
ETag: "360f-4d02f5fcfc34f"
Expires: Mon, 07 Jan 2013 08:56:49 GMT
Cache-Control: max-age=2419200, must-revalidate

Большое тебе спасибо!


person basbebe    schedule 10.12.2012    source источник
comment
Обычно веб-сервер обрабатывает такой персонал и правильно устанавливает заголовки 304 и 200. Вам действительно не нужно устанавливать какие-либо переменные get для правильной перезагрузки.   -  person Константин Рекунов    schedule 10.12.2012
comment
Реализуйте правильные заголовки кеша для каждого изображения. Если они могут измениться в любое время, не отправляйте заголовки, которые вообще мешают браузеру запрашивать сервер, но разрешите каждому из этих изображений отвечать со статусом 304. Использование вашей собственной стратегии будет означать, что вам придется каждый раз делать контрольную сумму для каждого изображения - это также предотвращает кеширование вашей PHP-страницы.   -  person Sven    schedule 10.12.2012


Ответы (1)


Использование заголовков кэширования на основе времени означает, что клиент вообще не будет спрашивать сервер, обновлялся ли файл какое-то время.
Использование заголовков кэширования Etag означает, что клиент будет запрашивать сервер каждый раз, но данные не обязательно переводится каждый раз.

Оба метода имеют свои плюсы и минусы. Для активов, которые редко когда-либо меняются, вы должны использовать заголовки кеша на основе времени, так как это сильно нагрузит ваш сервер. Чтобы они по-прежнему обновлялись, как только они обновляются, хорошей идеей является добавление уникального токена к их URL-адресу. Для активов, которые часто обновляются, рекомендуется использовать Etags без заголовков кэша с временной привязкой (или с очень короткоживущими), поскольку это означает, что они будут обновляться сразу после обновления, при этом разгружая сервер. Как правило, вы хотите пометить свои динамические веб-страницы страницы и кэшировать изображения во времени.

Итак, да, добавление хэша md5 к URL-адресу статических ресурсов, кэшированных во времени, является хорошей идеей, если клиент загружает обновленную версию как можно скорее. Убедитесь, что добавление этих хэшей не требует больше затрат, чем вы сэкономите.

person deceze♦    schedule 10.12.2012
comment
Спасибо за этот ответ! Я решил продолжить создание Etags для своих php-сайтов, но отказался от создания хеш-запросов для своих изображений. Они должны кэшироваться браузером до тех пор, пока это определено в заголовке ответа. Создание сумм md5 для каждого изображения по каждому запросу кажется мне накладным. - person basbebe; 10.12.2012