Я пытаюсь передать изображения webp на сервер поддерживающим браузерам, используя приведенный ниже код. У меня уже есть изображения .webp в дополнение к изображениям .png и .jpg того же файла.
Например, если у меня есть изображение с именем vacation.jpg, у меня также есть Vacation.jpg.webp.
Приведенный ниже код работает, но он перезаписывал другие мои блоки местоположения до того, как я переключился на CDN. Теперь я использую CDN, этот блок кода не имеет никакого эффекта, никаких изображений WEBP в ответ, а также не перезаписывает другие мои блоки местоположения.
Вот как это сделать:
Добавить в /etc/nginx/mime.types
“image/webp webp”
Добавить к основному nginx.conf файл:
map $http_accept $webp_suffix {
default “”;
“~*webp” “.webp”;
}
Добавить в серверный блок:
location ~* ^/wp-content/.+\.(png|jpg)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
Перезагрузите или перезагрузите nginx.
Пример других моих блоков местоположения:
location ~ .(ico|gif|png|jpe?g|svg|webp)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
location ~ \.(ico|gif|png|jpe?|svg|webp|eot|otf|ttf|ttc|woff|woff2|ogg|js|css|font.css)$ {
add_header Access-Control-Allow-Origin "*";
#gzip_vary on;
expires 30d;
}
Исходный вопрос был полностью изменен после того, как я опубликовал этот ответ, и этот ответ больше не имеет отношения к вопросу.
Несмотря на то, что у вас хорошие намерения, тот факт, что вы делаете 302 редирект, когда .webp
версия найдена, уменьшает выигрыш.
Перенаправление добавляет два цикла приема-передачи в задержку ко времени загрузки изображения, и если изображение достаточно маленькое, для получения сообщения потребуется больше времени. .webp
версия, чем оригинал.
Чтобы исправить это, вы должны сгенерировать URL-адреса непосредственно в коде вашего веб-сайта.
Однако, чтобы ответить на ваш текущий вопрос, вы можете использовать этот набор правил:
location ~ ^(/wp-content.+)\.(jpe?g|png)$ {
set $red Z;
if ($http_accept ~* "webp") {
set $red A;
}
if (-f $request_filename.webp) {
set $red "${red}B";
}
if ($red = "AB") {
add_header Vary Accept;
return 302 $1.webp;
}
}
Идея здесь в том, что первая часть имени файла уже записана в вашем location
директива. Поэтому первая часть новой локации находится в $1
переменная захвата регулярного выражения. Итак, можно просто использовать $1
в return
директива. я использую return
здесь, так как это быстрее, чем rewrite
.