wordpress - 如何( Varnish )基于接受 header 缓存 webp 图像

标签 wordpress nginx caching varnish webp

TLDR;

我正在升级我的客户端过时的服务器,但我无法根据浏览器接受 header 来缓存(或不缓存)webp 图像。 Varnish 会缓存 webp 图像,直到使用旧浏览器的人访问该网站为止。之后,所有(兼容 webp 的)浏览器都会获得缓存的 jpg 图像。

服务器设置

  • Ubuntu 18.04.2
  • Nginx 作为 ssl 终止符 (:443)
  • Varnish 可加快传输速度 (:80)
  • 由于特殊的 htaccess 要求,Apache2 作为后端 (:8080)
  • WordPress 网站
    • 用于 html 缓存的“wprocket”插件
    • “WebP Express”插件,用于动态提供 webp 图像(默认模式)
    • 核心和插件都是最新的

问题

当支持浏览器的 webp 访问该网站时(清除 Varnish 缓存后的第二次访问),它会提供扩展名为 .jpg 的图像,但是当您检查内容类型的 header 时,它会显示“image/webp”,就像“WebP Express”插件说它应该。 Varnish 日志很受欢迎,所以它工作得很好。但是,当我现在在 IE 中获取图像(不支持 webp)并返回 chrome 并刷新时,标题中的内容类型现在显示“image/jpg”并记录 Varnish 命中。这是不受欢迎的行为。它应该只在兼容的浏览器上提供 webp 图像,在旧浏览器上提供 jpg 版本。但它们应该被 Varnish 缓存,因为......(阅读下文)

不需要的解决方案

我已更改 default.vcl 文件以从缓存中排除 png|jpe?g|webp 文件。这当然“解决”了问题,但再次增加了加载时间。带 Varnish 的测试图像的平均加载时间:+/- 20ms。无 Varnish 的相同测试图像的平均加载时间:+/- 120ms。我知道差异很小,但在某些图库页面上差异显着。因此应启用 Varnish 缓存。

我尝试过的

将 webp 检查添加到我从以下位置获得的 default.vcl: https://github.com/igrigorik/webp-detect/blob/master/varnish.vcl --> 好像什么也没做? (是的,我重新启动了 Varnish 服务)

尝试了“WebP Express”插件常见问题解答中的“我在 NGINX”方法,但我陷入了该方法的第一步。我仍然认为这是错误的方法,因为它会在 varnish 周围循环,而不是通过 varnish 提供正确的版本。

我的问题

我该如何处理这个问题?与“WebP Express”插件设置有关吗?我是否必须将其添加到 default.vcl 文件中(这将是最简单的)。也许是两者的结合?或者也许是完全不同的东西?我陷入困境,现在欢迎任何建议。

最佳答案

我和我的同事花了更多时间测试和研究这个问题,我们似乎已经找到了解决方案。

我们只需将以下 3 行添加到 apache2 后端的 .htaccess 中:

# Fix for serving webp in compatible browsers with "webp express" wordpress plugin
<IfModule mod_headers.c>
    Header append Vary "content-type"
</IfModule>

之后重新启动 Varnish 服务,您也会在标题中看到它。

现在,varnish 在 Chrome 和其他兼容浏览器中始终提供 webp 图像,在 IE 和其他不兼容浏览器中提供 jpg 图像。

关于wordpress - 如何( Varnish )基于接受 header 缓存 webp 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56566507/

相关文章:

mysql - 如何在 WordPress 中的自定义字段组内循环

azure - 带有 Nginx 的 AKS 无法通过 IP 访问,只能通过 DNS 访问

html - 为静态内容缓存cdn服务?

php - 如何手动将 WooCommerce 产品排序设置为 "Popularity"?

php - 在使用 WordPress Submit_button() 提交之前运行 PHP 函数

php - Wordpress 函数在 wordpress 的 iframe 中不起作用

linux - 适用于 nginx 的 Windows .crl 到 .pem

docker - 努力将Nginx代理+ LetsEncrypt伴侣与我的Docker组成的Web应用程序集成

caching - Tensorflow 数据集 API : Cache

caching - 向 Spring Controller 添加 header