So regular, webp conditional loading works:
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
with small exception of pulling out of svg to separate location (otherwise there was xml parsing error in browser) and creating additional variable to persist $webp_suffix value
location ~* .(svg|svgz)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
try_files $uri $uri/ /get.php$is_args$args;
}
location ~* .(ico|jpg|jpeg|png|gif|webp|avif|avifs|js|css|eot|ttf|otf|woff|woff2)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
add_header Vary Accept;
set $webpvar $webp_suffix;
try_files $uri$webpvar $uri$webpvar/ /get.php$is_args$args;
}
But after enabling offloaded to Nginx images resizing:
location ~* .(jpg|jpeg|png|gif|webp)$ {
set $width "-";
set $height "-";
if ($arg_width != '') {
set $width $arg_width;
}
if ($arg_height != '') {
set $height $arg_height;
}
image_filter resize $width $height;
image_filter_webp_quality 90;
image_filter_jpeg_quality 90;
}
There’s no more conditional webp loading because of image_filtr module takes original $uri as input.
I’ve been trying to rewrite or redirect uri but either I end up with a loop and/or with webp being loaded as text/html with following code:
if ($uri !~* /media/(.*)(?:^|W)webp(?:$|W)) {
set $webpmediacheck 1;
}
if ($uri ~* /media/(.*)(?:^|W)jpg|jpeg|png(?:$|W)) {
set $webpmediacheck 1$webpmediacheck;
}
if ($webp_suffix = ".webp") {
set $webpmediacheck 1$webpmediacheck;
}
if ($webpmediacheck = 111) {
return 302 $scheme://$host$uri$webp_suffix$is_args$args;
}
Is there any smart way to achieve conditional webp loading and resizing?