htaccess:如果 webp 存在导致 404,则提供 webp 图像而不是 jpg 或 png
htaccess: serve webp image instead of jpg or png if webp exist results in 404
我生成了 *.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}/\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ .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 urls 然后给出 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}/\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ .webp [NC,L]
在这两个中,</code> 指的是 RewriteRule 中第一个捕获的匹配项,在本例中是 <code>(.+\.(?:jpe?g|png))
。如果您请求“marc.jpg”,则整个字符串匹配,并且将被放置在 </code> 中。因此,这两行的计算结果为:</p>
<blockquote>
<p>If the file "marc.jpg.webp" exists, respond with "marc.jpg.webp"</p>
</blockquote>
<p>既然没有,规则就不会是运行。</p>
<hr />
<p>您想要的条件是:</p>
<blockquote>
<p>If the file "marc.webp" exists, respond with "marc.webp"</p>
</blockquote>
<p>因此您希望 <code>
仅包含所请求文件的“marc”部分;这只是移动右括号的问题:
RewriteRule (.+)\.(?:jpe?g|png)$ .webp [NC,L]
这无法解释为什么您的规则似乎有效,但在您删除文件后却停止工作。我怀疑你在其他地方有另一条规则混淆了情况。
我生成了 *.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}/\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ .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 urls 然后给出 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}/\.webp -f
# THEN send the webp image and set the env var webp
RewriteRule (.+\.(?:jpe?g|png))$ .webp [NC,L]
在这两个中,</code> 指的是 RewriteRule 中第一个捕获的匹配项,在本例中是 <code>(.+\.(?:jpe?g|png))
。如果您请求“marc.jpg”,则整个字符串匹配,并且将被放置在 </code> 中。因此,这两行的计算结果为:</p>
<blockquote>
<p>If the file "marc.jpg.webp" exists, respond with "marc.jpg.webp"</p>
</blockquote>
<p>既然没有,规则就不会是运行。</p>
<hr />
<p>您想要的条件是:</p>
<blockquote>
<p>If the file "marc.webp" exists, respond with "marc.webp"</p>
</blockquote>
<p>因此您希望 <code>
仅包含所请求文件的“marc”部分;这只是移动右括号的问题:
RewriteRule (.+)\.(?:jpe?g|png)$ .webp [NC,L]
这无法解释为什么您的规则似乎有效,但在您删除文件后却停止工作。我怀疑你在其他地方有另一条规则混淆了情况。