CDN - обслуживать другой тип контента на основе заголовка Accept (Verizon/EdgeCast Premium)?
У меня есть сервер, который возвращает другой ответ, основанный на заголовке Accept, например, если заголовок Accept включает в себя "image/webp", изображение webp подается, в противном случае - jpg.
Мы запускаем Varnish на уровне сервера, и он делает это правильно, как показано ниже:
Запрос (с изображением / webp в заголовке Accept):
curl -s -D - -o /dev/null "https://REDACTED/media/tokinoha_bowl-4.jpg?sh=2&fmt=webp,jpg" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
Ответ (веб-изображение обслуживается):
HTTP/2 200
date: Wed, 06 Feb 2019 08:25:05 GMT
content-type: image/webp
access-control-allow-origin: *
cache-control: public, s-maxage=31536000, max-age=31536000
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains
vary: Accept-Encoding, Accept-Encoding,Origin
referrer-policy: strict-origin-when-cross-origin
accept-ranges: bytes
content-length: 60028
Запрос (нет webp в заголовке Accept, jpg обслужен):
curl -s -D - -o /dev/null "https://REDACTED/media/tokinoha_bowl-4.jpg?sh=2&fmt=webp,jpg" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/apng,*/*;q=0.8"
Отклик:
HTTP/2 200
date: Wed, 06 Feb 2019 08:25:18 GMT
content-type: image/jpeg
access-control-allow-origin: *
cache-control: public, s-maxage=31536000, max-age=31536000
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains
vary: Accept-Encoding, Accept-Encoding,Origin
referrer-policy: strict-origin-when-cross-origin
accept-ranges: bytes
content-length: 166991
У нас есть следующие параметры в настройке движка правил, однако, какой бы тип содержимого не кэшировался первым, он будет обслуживаться во всех последующих запросах независимо от заголовка запроса.
Правила настройки двигателя
Кто-нибудь знает способ достижения этого?
Заранее спасибо!
0 ответов
У нас была такая же проблема с Verizon/Edgecast:
Один URL-адрес доставил два разных типа изображений (JPEG
а также WebP
) в зависимости от Accept
заголовок. Источник (imgix) отправлен правильноVary: Accept
, но Edgecast
игнорирует это и кеширует то, что получает, поэтому браузеры без WebP
Служба поддержки иногда ошибалась форматом.
Мы решили это с помощью правила в Edgecast: правило WebP
Параметр запроса auto
всегда является частью URL
и поэтому всегда может быть удален из ключа кеша. Со вторым параметром запросаvaryWebP
мы определенно распознаем URL-адреса и предотвращаем конфликты с URL-адресами без параметра запроса auto
.
В этом случае URL
https://[HOST]/[PATH]?a=1&b=2&c=3&auto=compress,format
создает тот же ключ кеша, что и:
https://[HOST]/[PATH]?a=1&b=2&c=3
Вот почему параметр запроса varyWebP
защищает нас.