Использование mod_negotiation для обслуживания webp, если UA запрашивает его
Можно ли использовать mod_negotiation для показа изображения webp, если браузер его поддерживает, и jpg в противном случае?
Например, если я ссылаюсь на изображение с помощью пути /images/test, оно передает изображение, найденное по адресу /images/test.webp, если UA знает о webp, или jpg в противном случае?
Я пытался ковыряться, но кажется, что заголовки Accept в Chrome, по крайней мере, выглядят как Accept:*/*
вместо указания типа изображения.
Если это не способ сделать это, есть ли у кого-нибудь еще предложения?
2 ответа
Для обслуживания изображений WebP я использую правило перезаписи в nginx, которое проверяет наличие файла и поддержку изображений WebP. Я перенес это на Apache mod_rewrite, так как OP упоминает mod_negotiation. При переписывании выполняется поиск агента пользователя, содержащего слово "chrome", а затем выполняется проверка файла с расширением.webp с тем же именем и путем, что и у файла.jpg или.png, и, если это так, служит файлом WebP. Правило перезаписи немного глупо, но оно выполняет свою работу.
AddType image/webp .webp
# strip the extension off of all JPGs
RewriteCond %{HTTP_USER_AGENT} (chrome) [NC]
RewriteRule (.*)\.jpg$ $1
#check for a webp file, if so serve it
RewriteCond %{REQUEST_FILENAME}.webp -f
RewriteRule (.*) $1.webp [E=WEBP:1]
#check for if we did not have a webp file and we do have a jpg, if so serve it
RewriteCond %{REQUEST_FILENAME}.jpg -f
RewriteCond %{REQUEST_FILENAME}.webp !-f
RewriteRule (.*) $1.jpg
# strip the extension off of all PNGs
RewriteCond %{HTTP_USER_AGENT} (chrome) [NC]
RewriteRule (.*)\.png$ $1
#check for a webp file, if so serve it
RewriteCond %{REQUEST_FILENAME}.webp -f
RewriteRule (.*) $1.webp [E=WEBP:1]
#check for if we did not have a webp file and we do have a png, if so serve it
RewriteCond %{REQUEST_FILENAME}.png -f
RewriteCond %{REQUEST_FILENAME}.webp !-f
RewriteRule (.*) $1.png
Для моего сайта я могу позволить себе загружать свои фотографии через JavaScript после того, как смогу обнаружить поддержку WebP в браузере вместо того, чтобы полагаться на строку агента пользователя. Если существует поддержка WebP, тогда я устанавливаю куки-файл, прежде чем начать загружать свои изображения. Поэтому вместо этого RewriteCond
RewriteCond %{HTTP_USER_AGENT} (chrome) [NC]
Я бы использовал это
RewriteCond %{HTTP_COOKIE} supports_webp
Заголовок Accept не является обязательным, и когда он снабжен значимыми значениями, он просто указывает серверу, какие типы контента клиент должен получить для этого конкретного запроса.
В прошлом, например, когда png не был хорошо поддержан, я использовал подобные правила (адаптированные под ваш вопрос). Webp поддерживается двумя браузерами, что делает правила довольно простыми.
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} \ Chrome/ [OR]
RewriteCond %{HTTP_USER_AGENT} Opera.*Version/11.1
RewriteRule .* - [E=imgext:webp,T=image/webp]
RewriteCond %{ENV:imgext} !webp
RewriteRule .* - [E=imgext:jpg]
RewriteCond %{REQUEST_URI} ^/images/
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) $1\.%{ENV:imgext} [QSA]