Использование 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]
Другие вопросы по тегам