验证客户端是否支持 WebP,核心是检查请求头中的 Accept 字段是否包含 image/webp;需结合文件存在性检查和格式限定,并设置 Vary: Accept 响应头以确保缓存正确。

验证客户端是否支持 WebP,核心是检查请求头中的 Accept 字段是否包含 image/webp。RewriteCond 本身不执行重写,只做判断;真正起作用的是它与 RewriteRule 的配合,且必须确保后续规则能准确响应这个判断结果。
检查 Accept 请求头是否声明支持 WebP
这是最直接、最标准的验证方式:
- 用
RewriteCond %{HTTP_ACCEPT} image/webp判断浏览器明确声明了支持 - 注意:
!image/webp表示“不支持”,但不能覆盖无Accept头的旧 UA(比如某些嵌入式 WebView),需额外兜底 - 该条件对大小写不敏感,无需加
[NC];正则中若含特殊字符(如/),建议用转义或字面匹配更稳妥
叠加文件存在性检查,避免 404
光有 Accept 支持还不够,服务器上必须有对应的 .webp 文件,否则 rewrite 后返回 404,反而拖慢加载:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 加一条
RewriteCond %{REQUEST_FILENAME}.webp -f,确认同名 .webp 文件真实存在 - 再加
RewriteCond %{REQUEST_FILENAME} (?i)\.(png|jpe?g|gif)$限定只对原始图格式生效,防止误匹配其他资源 - 三个条件默认为 AND 关系,全部满足才触发 RewriteRule
用响应头或环境变量直观确认条件是否触发
调试阶段不依赖日志也能快速验证逻辑是否走通:
- 设置环境变量:
RewriteRule ^ - [E=WEBP_SUPPORTED:1](放在条件块后、主规则前) - 再用
Header set X-WebP "%{WEBP_SUPPORTED}e"输出到响应头,浏览器开发者工具 → Network → Response Headers 里就能看到值 - 或者更轻量:临时加一条跳转规则,如
RewriteRule ^test-webp$ /debug-webp.html [R=302,L],仅当所有 RewriteCond 满足时才跳转
生产环境必须加 Vary: Accept 响应头
CDN 或代理缓存会根据这个头区分不同版本的响应,否则可能把 WebP 缓存给了不支持的客户端:
- 在
<IfModule mod_headers.c>块中添加:Header append Vary Accept - 不要写成
Vary: Accept,User-Agent——除非你真基于 UA 做了差异化服务,否则多余字段会降低缓存命中率 - 这条头必须出现在所有可能返回 WebP 的响应中,包括 404 或重定向响应(可通过 ErrorDocument 或自定义处理确保)

















