第一次在这里发帖,所以我希望我做得很好。
我从我的 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 图片。
- 图像文件 perms 在 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>
请问你们能帮我吗?
在文件中,模式
.htaccess
匹配的 URL 路径不以斜杠开头。所以上面的指令永远不会匹配请求的 URL,所以不会做任何事情。在您之前的规则中,您将匹配数字作为第一个字符,而不是斜线。RewriteRule
例如,它应该是:
然而...
根据
/img/.htaccess
文件中包含的指令,这些指令可能会完全覆盖父.htaccess
文件中的 mod_rewrite 指令。父级中的 mod_rewrite 指令.htaccess
甚至可能没有得到处理。更新:现在看到该
/img/.htaccess
文件就可以了 - 这些指令不会覆盖父.htaccess
文件中关于将请求重写到.webp
图像的指令。由于这些附加规则仅适用于
/img
子目录并且您已经.htaccess
在子目录中有一个文件,因此/img
您可以将这些规则写入/img/.htaccess
文件中(需要稍作调整)。例如:该
RewriteRule
模式与相对于包含该.htaccess
文件的目录的 URL 路径匹配。/img
因此,在这种情况下,它与子目录不匹配。要完成规则并合并您提到的其他条件,您可以执行以下操作。现在回到根
.htaccess
文件:如果保证相应的
.webp
图像存在,那么您不一定需要文件系统检查(第二个条件)。(我不确定你为什么需要
E=REQUEST_image
?)如果使用子目录
.htaccess
中的文件:/img
在旁边:
第三条规则没有做任何事情,应该被删除。前两个规则可以很容易地在文件扩展名上使用正则表达式交替组合。例如。
(jpg|webp)
.