2010-06-11 1 views
6

Я пытаюсь выяснить, могу ли я заставить браузеры кэшировать изображения с подписанными URL-адресами.Кэширование изображений с различными строками запросов (S3 подписанные URL)

Я хочу создать новый подписанный URL для каждого запроса (то же изображение, но с обновленной подписью), но браузер не будет повторно загружать его каждый раз.

Итак, предположим, что заголовки, связанные с кешем, установлены правильно, и весь URL-адрес тот же, за исключением строки запроса, есть ли способ сделать его кеш браузера?

URL, будет выглядеть примерно так:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463 
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500 

Мы планируем установить электронные метки, чтобы быть md5sum, так это будет, по крайней мере выяснить, это то же самое изображение в этой точке?

Мой другой вариант - отслеживать, когда последний выдавал URL-адрес, а затем начинать выдавать новые, прежде чем старые истекают, но я бы предпочел не заниматься информацией о сеансе.

ответ

4

Браузер будет использовать весь URL для целей кеширования, включая параметры запроса. Поэтому, если вы измените параметр запроса, он будет эффективно представлять собой новый «ключ» в кеше и всегда будет загружать новую копию этого изображения. Это популярный метод в мире рекламы: вы добавляете случайное число (или текущую временную метку) в конец URL-адреса в качестве параметра, чтобы браузер всегда возвращался на сервер для создания нового запроса.

Единственный способ заставить это работать, если вы можете сделать URL статическим - например, с помощью правил перезаписи Apache или какого-либо прокси-сервера.

+0

Знаете ли вы, что он хотя бы проверит e-tag и не загрузит его еще раз? –

+0

Заголовок ETag отправляется браузером только на сервер, когда он находит файл в его кеше (и если исходный файл имеет значение ETag). Поэтому, если он не может найти его в своем кеше (который не будет, если URL-адрес изменился), нет значения ETag для отправки запроса. –

+1

Правило перезаписи URL-адресов снова сделает подпись S3 бесполезной, поскольку веб-сервер автоматически предоставит ссылку с истекшим сроком действия. Затем вы также можете пометить файлы в S3 как «общедоступные». (Тогда для доступа к файлам не требуется подпись) – Tarnschaf

3

У меня была такая же проблема с подписанными URL S3. Единственное решение, с которым я столкнулся, заключается в том, что URL-адреса истекают в тот же день. Это не идеально, но, по крайней мере, он будет обеспечивать кеширование в течение некоторого времени.

Например, все URL-адреса, подписанные в апреле, я установил истечение срока действия 10 мая. Все URL-адреса, подписанные в июне, я истечет 10 июля. Это означает, что подписанные URL-адреса будут одинаковыми в течение всего месяца.

1

Просто наткнулся на эту проблему и нашел способ ее решить. Вот что вам нужно сделать:

  1. Сохраните первую строку URL (например, localStorage);
  2. Когда вы получаете IMG URL-адрес в следующий раз просто проверить, если их основной URLs матч (str1.split('?')[0] === str2.split('?')[0])
  3. Если они делают, используйте первый в качестве IMG src атрибута.

Надеюсь, это поможет кому-то.

Смежные вопросы