我有一个服务器,该服务器根据Accept标头返回不同的响应,例如如果“接受”标头包含“ image / webp”,则投放webp图片,否则提供jpg。
我们在服务器级别运行Varnish,并且可以正确执行此操作,如下例所示:
请求(在“接受”标头中带有图片/ webp):
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"
响应(已投放webp图片):
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
请求(Accept标头中没有webp,提供了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 :(得分:1)
我们在Verizon/Edgecast:
上遇到了同样的问题,一个URL根据JPEG
标头提供了两种不同的图像类型(WebP
和Accept
)。来源(imgix)正确发送了Vary: Accept
,但是Edgecast
忽略了它,并缓存了它得到的内容,因此没有WebP
支持的浏览器有时格式错误。
我们使用Edgecast中的规则解决了它: WebP rule
查询参数auto
始终是URL
的一部分,因此始终可以从缓存键中删除。使用第二个查询参数varyWebP
,我们可以肯定地识别URL,并防止与没有查询参数auto
的URL发生冲突。
在这种情况下,URL
https://[HOST]/[PATH]?a=1&b=2&c=3&auto=compress,format
创建与以下相同的缓存键:
https://[HOST]/[PATH]?a=1&b=2&c=3
这就是查询参数varyWebP
保护我们的原因。