如果浏览器支持它,是否可以使用mod_negotiation来提供webp图像,否则可以使用jpg?
例如,如果我链接到带有路径/ images / test的图像,它会提供在/images/test.webp中找到的图像,如果UA知道webp,或者jpg,不然吗?
我尝试过,但Chrome中的Accept标头似乎至少看起来像Accept:*/*
,而不是指定图像类型。
如果不是这样做的话,还有人有其他建议吗?
答案 0 :(得分: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
对于我的网站,我能够在浏览器中检测到对WebP的支持而不是依赖用户代理字符串后,能够通过JavaScript加载我的照片。如果存在WebP支持,则在我开始加载图像之前设置cookie。因此,而不是这个RewriteCond
RewriteCond %{HTTP_USER_AGENT} (chrome) [NC]
我会用这个
RewriteCond %{HTTP_COOKIE} supports_webp
答案 1 :(得分:1)
不需要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]