第一次在这里发帖,所以我希望我写得很好。
我将 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 类型)。
请注意:
- 每次我更改 .htaccess 并尝试解决方案时,我都会清除 prestashop 缓存,以防万一(尽管知道每次请求时都会读取 .htaccess)。
- img文件夹中存在与jpg/png对应的webp图片。
- img 文件夹中的图像文件权限正确,并且 public_html 下的所有内容中图像文件的权限也正确。
- 在 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)
。