尝试让 Apache 提供 webp 而不是 png/jpg(来自 prestashop 的 /img 文件夹)

尝试让 Apache 提供 webp 而不是 png/jpg(来自 prestashop 的 /img 文件夹)

第一次在这里发帖,所以我希望我写得很好。

我将 prestashop public_html 文件夹中的所有 png/jpg 转换为 webp,并向 .htaccess 添加重写规则,以便提供 webp 而不是 png/jpg。

我根据已有的 Prestashop 重写进行了重写。
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]
我最终做了:

RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L]
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.webp$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L]
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]

哪个有效:我得到了一个提供 webp 图片的 jpg URL,到目前为止一切顺利(我知道仍然需要实现

#RewriteCond %{HTTP_ACCEPT} image/webp
#RewriteCond %{DOCUMENT_ROOT}/$1.webp -f

并试图弄清楚我是否应该离开[L]或做[L,T=image/webp]或做[T=image/webp,E=REQUEST_image],这就是为什么我正在阅读与 apache 相关的文档并在网上搜索有关重写相关主题的内容,这确实非常庞大。

好的,回到主题,我发现我缺少对 prestashop 存储在 public_html/img 文件夹中的图像的 webp 重写。

然后我尝试了以下方法(以及其他变体):

RewriteRule ^/img/(.+)\.jpe?g$ /img/$1.webp [L]
RewriteRule ^/img/(.+)\.png$ /img/$1.webp [L]

^--- 不好... 仍然从 img 目录提供 jpg/png 类型的图像(仔细检查了 MIME 类型)。

请注意:

  1. 每次我更改 .htaccess 并尝试解决方案时,我都会清除 prestashop 缓存,以防万一(尽管知道每次请求时都会读取 .htaccess)。
  2. img文件夹中存在与jpg/png对应的webp图片。
  3. img 文件夹中的图像文件权限正确,并且 public_html 下的所有内容中图像文件的权限也正确。
  4. 在 prestashop 的 img 文件夹中,还有另一个 .htaccess,它限制了可以从该文件夹提供的文件类型,并且我已经添加了 webp,以防有人询问。

更新:根据 MrWhite 的要求,添加 img 文件夹的 .htaccess

<IfModule mod_php5.c>
    php_flag engine off
</IfModule>

# Apache 2.2
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
    <Files ~ "(?i)^.*\.(webp|jpg|jpeg|gif|png|bmp|tiff|svg|pdf|mov|mpeg|mp4|avi|mpg|wma|flv|webm|ico)$">
        Allow from all
    </Files>
</IfModule>

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all denied
    <Files ~ "(?i)^.*\.(webp|jpg|jpeg|gif|png|bmp|tiff|svg|pdf|mov|mpeg|mp4|avi|mpg|wma|flv|webm|ico)$">
        Require all granted
    </Files>
</IfModule>

你们能帮我一下吗?

答案1

RewriteRule ^/img/(.+)\.jpe?g$ /img/$1.webp [L]
RewriteRule ^/img/(.+)\.png$ /img/$1.webp [L]

.htaccess文件中,URL 路径RewriteRule 图案匹配,不以斜线开头。因此,上述指令永远不会匹配请求的 URL,因此不会执行任何操作。在之前的规则中,您匹配的是数字作为第一个字符,而不是斜线。

例如,它应该是:

RewriteRule ^img/(.+)\.jpe?g$ /img/$1.webp [L]

然而...

在prestashop的img文件夹中,还有另一个.htaccess

根据/img/.htaccess文件中包含的指令,这些指令可能会完全覆盖父文件中的 mod_rewrite 指令.htaccess。父文件中的 mod_rewrite 指令.htaccess甚至可能不会得到处理。

更新:现在看到该/img/.htaccess文件就没问题了——这些指令将不会覆盖父.htaccess文件中关于重写对.webp图像的请求的指令。

由于这些附加规则仅适用于子目录,并且子目录中/img已经有文件,因此您可以将这些规则写入文件中(需要进行轻微调整)。例如:.htaccess/img/img/.htaccess

# /img/.htaccess

RewriteEngine On

RewriteRule ^(.+)\.jpe?g$ $1.webp [L]

RewriteRule 图案与 URL 路径匹配相对的到包含该文件的目录.htaccess。因此,在这种情况下,它与子目录不匹配/img


要完成规则并纳入您提到的其他条件,您可以执行以下操作。现在回到根.htaccess文件:

# /.htaccess

# Rewrite image request to ".webp" if supported and exists
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule ^(img/.+)\.(jpe?g|png)$ $1.webp [L,T=image/webp]

如果.webp保证相应的图像存在,那么您就不一定需要文件系统检查(第二个条件)。

(我不确定你为什么需要E=REQUEST_image?)

如果使用子目录.htaccess中的文件/img

# /img/.htaccess

# Rewrite image request to ".webp" if supported and exists
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/img/$1.webp -f
RewriteRule ^(.+)\.(jpe?g|png)$ $1.webp [L,T=image/webp]

在旁边:

RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L]
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.webp$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L]
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]

第三条规则没有任何作用,应删除。前两条规则可以通过对文件扩展名使用正则表达式交替轻松组合。例如(jpg|webp)

相关内容