如何解决htaccess:如果 webp 存在导致 404,则提供 webp 图像而不是 jpg 或 png
我生成的 *.webp 文件的名称与它们的 png 或 jpg 源完全相同。然后我将它添加到我的 .htaccess 中:
<IfModule mod_rewrite.c>
RewriteEngine On
# Does browser explicitly support webp?
RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
# OR Is request from Page Speed
RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
# OR does this browser explicitly support webp
RewriteCond %{HTTP_ACCEPT} image/webp [OR]
# AND does a webp image exists?
RewriteCond %{DOCUMENT_ROOT}/$1\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ $1.webp [NC,L]
</IfModule>
<IfModule mod_mime.c>
AddType image/webp .webp
</IfModule>
我的期望:
所有 jpg 文件正常加载,例如 /test/marc.jpg 如果存在同名的 webp,则通过 url /test/marc.jpg 提供 webp 文件
这个作品的webp文件存在。但是如果我删除一个 webp 文件,我会在 jpg 或 png url 上得到一个 404。即使是旧的 jpg 或 png 网址也会给出 404。示例:
/www/media/
.htaccess
marc.jpg
marc.webp
http://domain/marc.jpg 服务于 webp。我在禁用缓存的情况下从 chrome 测试了这个。当我删除 marc.webp 时,我在 http://domain/marc.jpg 上得到 404 为什么? RewriteCond %{DOCUMENT_ROOT}/$1.webp -f 应该可以解决这个问题,对吗?
解决方法
这两行不是在寻找你描述的文件:
# AND does a webp image exists?
RewriteCond %{DOCUMENT_ROOT}/$1\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ $1.webp [NC,L]
在这两种情况下,$1
指的是 RewriteRule 中第一个捕获的匹配项,在本例中为 (.+\.(?:jpe?g|png))
。如果您请求“marc.jpg”,则整个字符串匹配,并将放置在 $1
中。这两行因此评估为:
如果文件“marc.jpg.webp”存在,回复“marc.jpg.webp”
因为没有,规则将不会运行。
您想要的条件是:
如果文件“marc.webp”存在,回复“marc.webp”
所以你希望 $1
只包含请求文件的“marc”部分;这只是移动右括号的问题:
RewriteRule (.+)\.(?:jpe?g|png)$ $1.webp [NC,L]
这不能解释为什么您的规则似乎有效,并在您删除文件时停止工作。我怀疑您在其他地方有另一条规则,这使情况变得混乱。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。