在 apache 中判断 http_accept 是否支持 webp,核心做法是使用 rewritecond 指令检查 %{http_accept} 环境变量,通过正则表达式匹配包含 image/webp 的字符串。只要请求头中包含该 mime 类型,条件即成立,随后配合 rewriterule 将请求重定向到对应的 .webp 文件。

如何编写精确的正则匹配规则
直接回答:使用 -NC(不区分大小写)和 -OR(逻辑或)组合多个条件,可以覆盖大多数浏览器对 WebP 的支持情况。通常只需匹配 image/webp 即可,因为现代浏览器会在 Accept 头中明确列出支持的格式。

# 假设网站根目录为 /var/www/html
# 目标图片为 /images/photo.jpg
# 对应的 WebP 文件为 /images/photo.webp
RewriteEngine On
# 检查客户端是否接受 image/webp
RewriteCond %{HTTP_ACCEPT} image/webp [NC]
# 检查 WebP 文件是否存在
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
# 执行重写:将 .jpg 请求内部重定向到 .webp
RewriteRule ^(.+)\.jpg$ $1.webp [T=image/webp,L]
上述配置中,RewriteCond 的第一行检查 HTTP_ACCEPT 是否包含 image/webp。-NC 标志确保匹配不区分大小写,防止因浏览器发送 Image/WebP 而失效。第二行 -f 测试确保物理文件存在,避免返回 404。第三行 RewriteRule 捕获文件名部分,并指定 T=image/webp 强制设置响应内容类型为 image/webp,这是关键步骤,否则浏览器可能因 MIME 类型不匹配而拒绝显示图片。
如何处理不支持 WebP 的旧版浏览器回退
直接回答:当 HTTP_ACCEPT 不包含 image/webp 时,Apache 会跳过上述规则,继续处理原始请求,从而自动回退到原始的 JPG/PNG 文件。无需显式编写“否则”分支,利用 Apache 规则执行的短路特性即可实现。
通过Apache Tika Server REST API从1400多种文件格式中提取文本和元数据。处理PDF、DOCX、PPTX、电子邮件归档以及带有MIME类型检测的嵌入式文档提取。

# 完整示例:同时处理 jpg 和 png
RewriteEngine On
# 针对 JPG 图片
RewriteCond %{HTTP_ACCEPT} image/webp [NC]
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule ^(.+)\.jpg$ $1.webp [T=image/webp,L]
# 针对 PNG 图片
RewriteCond %{HTTP_ACCEPT} image/webp [NC]
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule ^(.+)\.png$ $1.webp [T=image/webp,L]
在这个完整示例中,我们分别处理了 .jpg 和 .png 扩展名。对于每种格式,都先检查 HTTP_ACCEPT 是否支持 WebP,再检查对应的 .webp 文件是否存在。如果两个条件都满足,则重写为 WebP 版本;如果不满足(例如浏览器不支持 WebP,或者 WebP 文件不存在),Apache 会继续查找其他规则或默认提供原始文件。这种结构简洁且高效,避免了复杂的条件嵌套。
当 WebP 文件缺失时服务器返回什么状态码
直接回答:如果 HTTP_ACCEPT 匹配 WebP,但对应的 .webp 文件不存在(即 -f 测试失败),Apache 不会执行重写规则,而是继续处理原始请求。如果原始请求的文件(如 .jpg)也不存在,服务器最终会返回标准的 404 Not Found 状态码。因此,配置本身不会导致额外的错误状态,它只是有条件地选择资源。










