.htaccess htaccess:如果webp存在,则提供webp图像而不是jpg或png,结果是404

.htaccess htaccess:如果webp存在,则提供webp图像而不是jpg或png,结果是404,.htaccess,mod-rewrite,webp,.htaccess,Mod Rewrite,Webp,我生成的*.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_

我生成的*.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> 

http://domain/marc.jpg 为webp服务。我在禁用缓存的情况下从chrome上测试这个。当我删除marc.webp时,我得到了一个404http://domain/marc.jpg 为什么?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
指的是重写规则中捕获的第一个匹配项,在本例中为
(.+\(?: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]


这并不能解释为什么您的规则看起来有效,并且在删除文件时停止工作。我怀疑你在其他地方有另一条规则,这会混淆情况。

看看这条规则,我看不出它是如何工作的,因为$1将引用整个“marc.jpg”,所以尝试加载“marc.jpg.webp”,而不是“marc.webp”。我也不知道你可以像那样在RewriteCond中使用RewriteRule中的$1,但也许你可以?最初的脚本有这样一个:RewriteBase上的RewriteEngine/但是我删除了RewriteBase。但对于RewriteBase,它根本不起作用。甚至在我的root/And/test/marc.jpg.webp中也不起作用;真正的Google Chrome应该发送一个正确的Accept头(无论如何,你都要测试它的下一步),并且没有特别的理由假设任何其他浏览器在其用户代理中都能正确处理WebP图像。你是对的:有另一个规则fastest cache插件改变了这些URL。谢谢
 RewriteRule (.+)\.(?:jpe?g|png)$ $1.webp [NC,L]