Если вы будете перенаправлены пользователю подписанного URL с помощью 302 Found
браузер будет кэшировать полученное изображение в соответствии с его заголовком cache-control
и не будет просить его во второй раз.
Чтобы предотвратить браузер от кэширования самого подписанного URL, вы должны отправить правильный Cache-Control
заголовок вместе с ним:
Cache-Control: private, no-cache, no-store, must-revalidate
Так что в следующий раз он будет посылать запрос к исходному URL и будет перенаправлен на новый подписанный URL.
Вы можете создать подписанный URL-адрес с помощью knox
, используя signedUrl
method.
Но не забудьте установить правильные заголовки для каждого загруженного изображения. Я бы рекомендовал использовать как заголовки Cache-Control
, так и Expires
, потому что у какого-то браузера нет поддержки Cache-Control
, а Expires
позволяет установить только абсолютное время истечения.
С помощью второго варианта (потокового изображения через приложение) вы сможете лучше контролировать ситуацию. Например, вы сможете генерировать заголовок Expires
для каждого ответа в соответствии с текущей датой и временем.
А как насчет скорости? Использование подписанных URL-адресов имеет два преимущества, которые могут повлиять на скорость загрузки страницы.
Во-первых, вы не будете перегружать свой сервер. Создание подписанных URL-адресов, если это быстро, потому что вы просто хешируете свои учетные данные AWS. И для потоковой передачи изображений через ваш сервер вам нужно будет поддерживать множество дополнительных подключений во время загрузки страницы. В любом случае, это не будет иметь никакого реального разницы, если ваш сервер не загружен.
Во-вторых, браузеры поддерживают только два параллельных соединения для имени хоста во время загрузки страницы. Таким образом, браузер будет поддерживать одновременное разрешение URL-адресов при их загрузке. Он также сохранит загрузку изображений из блокировки загрузки любых других ресурсов.
В любом случае, чтобы быть абсолютно уверенным, вы должны запустить некоторые тесты. Мой ответ основывался на моем знании спецификации HTTP и моем опыте в веб-разработке, но я никогда не пытался служить изображениям таким образом самостоятельно. Обслуживание общедоступных изображений с длительным сроком службы кеша непосредственно с S3 увеличивает скорость страницы, я считаю, что ситуация не изменится, если вы сделаете это через перенаправления.
И вы должны иметь в виду, что потоковые изображения через ваш сервер принесут все преимущества Amazon CloudFront к нулю. Но пока вы обслуживаете контент напрямую из S3, оба варианта будут работать нормально.
Таким образом, есть два случая, когда с помощью подписанных URL-адресов должны ускорив страницы:
- Если у вас есть много изображений на одной странице.
- Если вы используете изображения с помощью CloudFront.
Если у вас есть только несколько изображений на каждой странице и обслуживание их непосредственно с S3, вы, вероятно, не увидите никакой разницы.
Важное обновление
Я провел несколько тестов и обнаружил, что я был неправ о кэшировании. Верно, что браузеры кэшируют изображения, к которым они были перенаправлены. Но он связывает кэшированное изображение с URL-адресом, на который он был перенаправлен, а не с оригинальным. Таким образом, когда браузер второй раз загружает страницу, он снова запрашивает изображение с сервера, а не извлекает его из кеша. Конечно, если сервер отвечает с тем же URL-адресом перенаправления, он ответил в первый раз, браузер будет использовать свой кеш, но это не относится к подписанным URL-адресам.
Я обнаружил, что заставляя браузер кэшировать подписанный URL-адрес, а также данные, которые он получает, решает проблему. Но мне не нравится идея кэширования неверного URL-адреса переадресации. Я имею в виду, что если браузер будет пропускать изображение, он попытается снова запросить его, используя недопустимый подписанный url из кеша. Поэтому я думаю, что это не вариант.
И неважно, если CloudFront будет работать с изображениями быстрее или если браузер ограничивает количество параллельных загрузок на имя хоста, преимущество использования кеша браузера превосходит все недостатки изображений каналов через ваш сервер.
И похоже, что большинство социальных сетей решает проблему с частными изображениями, скрывая свои фактические URL-адреса за некоторыми частными прокси. Таким образом, они хранят весь свой контент на общедоступных серверах, но нет способа получить URL-адрес для частного изображения без авторизации. Конечно, если вы откроете личное изображение на новой вкладке и отправьте URL-адрес своему другу, он также сможет увидеть изображение. Итак, если это не вариант для вас, вам будет лучше использовать Jonathan Ong's solution.
Пойду с ответом для примера. Большое спасибо. Но если вы не возражаете, можете ли вы помочь мне с чем-то еще. Использование AWS-SDK лучше или knox? –
Никогда не пробовал aws-sdk. Тем не менее, поддерживающие Нокс больше связаны с сообществом узлов. –
Однако ?? Вы же не сказали, что? –