Я использую следующее, пытаясь обслуживать изображения webp из Magento, используя Nginx и Varnish в качестве кеширования.
Добавлен в /etc/nginx/mime.types
image/webp webp;
Добавлен в главный nginx.conf
http {
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
}
Добавлен в my-site.conf для серверного блока Magento 2
location /media/ {
try_files $uri $uri/ /get.php?$args;
location ~ ^/media/theme_customization/.*\.xml {
deny all;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|webp)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
try_files $uri$webp_suffix $uri$webp_suffix/ /get.php?$args;
}
Но я все равно получаю изображения jpg вместо webp. Что я делаю не так?
Когда map
определен как:
map $http_accept $webp_suffix {
default "";
"~image/webp" ".webp";
}
А когда try_files
как:
try_files $uri$webp_suffix $uri$webp_suffix/ /get.php$args;
Это означает, что когда URI запроса будет /media/image. jpg
, nginx будет искать image.jpg.webp
, если HTTP-заголовок пользователя Accept
содержит image/webp
.
Таким образом, вам нужно добавить расширение .webp
ко всем именам файлов изображений, а не заменять расширение.
Редактировать:
Чтобы это работало на любом кэширующем сервере, помимо оригинального сервера, кэш должен кэшировать разные версии URL.
Для этого нужно добавить
add_header Vary Accept;
в конфигурацию nginx. Это говорит кэшу восходящего потока, что он должен хранить различные версии URL, основываясь на Accept
заголовке пользователя.
Таким образом, в вашем случае Varnish должен быть настроен на подчинение заголовку Accept
.
Cloudflare - это еще одна проблема. Он не поддерживает Vary: Accept
заголовок вообще, так что этот подход к обслуживанию WebP изображений не работает с Cloudflare из коробки.
Это можно обойти, добавив Cloudflare worker, который извлекает заголовок Accept
из запросов и определяет ключи кэша на его основе.