AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1096330
Accepted
Totoro
Totoro
Asked: 2022-03-17 12:32:11 +0800 CST2022-03-17 12:32:11 +0800 CST 2022-03-17 12:32:11 +0800 CST

试图让 Apache 服务于 webp 而不是 png/jpg(来自 prestashop 的 /img 文件夹)

  • 772

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

我从我的 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. 图像文件 perms 在 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>

请问你们能帮我吗?

rewrite .htaccess extension mod-rewrite images
  • 1 1 个回答
  • 536 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2022-03-17T15:10:21+08:002022-03-17T15:10:21+08:00
    RewriteRule ^/img/(.+)\.jpe?g$ /img/$1.webp [L]
    RewriteRule ^/img/(.+)\.png$ /img/$1.webp [L]
    

    在文件中,模式.htaccess匹配的 URL 路径不以斜杠开头。所以上面的指令永远不会匹配请求的 URL,所以不会做任何事情。在您之前的规则中,您将匹配数字作为第一个字符,而不是斜线。RewriteRule

    例如,它应该是:

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

    然而...

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

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

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

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

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

    该RewriteRule 模式与相对于包含该.htaccess文件的目录的 URL 路径匹配。/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).

    • 0

相关问题

  • 阿帕奇虚拟主机

  • IIS 7 中的 URL 重写

  • IIS7 请求跟踪日志上的 URL_CHANGED 事件是什么?

  • 如何强制我的网址始终以 www 开头?

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve