如果UA请求,则使用mod_negotiation来提供webp

时间:2011-05-15 18:12:33

标签: apache mod-negotiation

如果浏览器支持它,是否可以使用mod_negotiation来提供webp图像,否则可以使用jpg?

例如,如果我链接到带有路径/ images / test的图像,它会提供在/images/test.webp中找到的图像,如果UA知道webp,或者jpg,不然吗?

我尝试过,但Chrome中的Accept标头似乎至少看起来像Accept:*/*,而不是指定图像类型。

如果不是这样做的话,还有人有其他建议吗?

2 个答案:

答案 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]