【问题标题】:htaccess: serve webp image instead of jpg or png if webp exist results in 404htaccess:如果 webp 存在,则提供 webp 图像而不是 jpg 或 png 导致 404
【发布时间】:2021-04-03 12:02:15
【问题描述】:

我生成了 *.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 应该可以解决这个问题,对吧?

【问题讨论】:

  • 看这个,我看不出它是怎么工作的,因为 $1 将引用整个“marc.jpg”,所以尝试加载“marc.jpg.webp”,不是“marc.webp”。我也不知道你可以像这样在 RewriteCond 中使用 RewriteRule 中的 $1,但也许你可以?
  • 原始脚本开头有这个: RewriteEngine On RewriteBase / 但我删除了 RewriteBase。但是使用 RewriteBase 它根本不起作用。即使在我的根目录中 /
  • 而且 /test/marc.jpg.webp 也不起作用。
  • 附带说明,测试用户代理,尤其是像“Chrome”这样通用的东西,是个坏主意;真正的 Google Chrome 浏览器应该发送正确的 Accept 标头(无论如何您都可以进一步测试),并且没有特别的理由假设任何其他浏览器在其用户代理中都可以正确处理 WebP 图像。

标签: .htaccess mod-rewrite webp


【解决方案1】:

这两行不是在寻找你描述的文件:

 # 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]

这不能解释为什么您的规则似乎有效,并且在您删除文件时停止工作。我怀疑您在其他地方有另一个规则,这使情况变得混乱。

【讨论】:

  • 你是对的:有另一个规则最快的缓存插件改变了这些 url。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2022-01-03
  • 1970-01-01
  • 2023-01-03
  • 2018-05-10
  • 2021-05-08
  • 2019-02-14
相关资源
最近更新 更多