PIWIGO图片引用BUG的问题解决方案

发布于 2023-12-09  445 次阅读


问题发现

  • piwigo做图床挺好用的,有上传的相册划分,权限管理,数据库的优化清理,图片备份,还有大量的插件和皮肤.但是因为开发者是国外的并且国内没什么热度,基本上没什么社区支持,从更新到遇到问题都不怎么好解决
  • 最近我在使用中发现了一个bug(定时炸弹),我启用了piwigo自带的图片水印功能

  • 刚开始我就对这个功能抱有疑虑,如果它仅支持将新上传的图片添加水印那么只能说理应如此,但是当我打开启用这个功能之前发的博客时,发现以前的图片也被加上水印了,难道它能够遍历本地的存档然后逐个修改图片吗.
  • 果然,奇怪的功能必然伴随奇怪的结果,有一部分启用功能之前的图片没有加上水印,有一部分启用功能之前的图片能够正常加上水印,而有一部分启用功能之前的图片直接无法加载了
  • 以前的图片没了是个大问题,我的本地也是引用的图床的链接😡我尝试了维护组件中的各种功能,都没有任何作用

问题解决

  • 分析过程暂且不表,直接上结论吧,piwigo上传图片后,图片会被存储在piwigo入口php(假设为/piwigo/index.php)同目录下的upload文件夹(/piwigo/upload/),这些图片是不带水印的
  • piwigo在线预览中使用的图片并不是直接调用upload文件夹下面的原图片,而是通过调用index.php同层的i.php这个api获取的,比如原图片为/piwigo/upload/1.jpg,那么调用链接为/piwigo/i.php?/upload/1-xx.jpg,这里要在原图片名加一个xx,否则就会报错

  • 但是当我们手动复制上传的图片地址时,有概率复制的地址是图片的原地址,即不通过i.php调用,这解释了部分图片没有水印的原因(为啥有的cv下来是原地址不清楚)

  • 那么部分图片显示错误是怎么回事呢,piwigo在线预览的时候可能会缓存一份图片到_data目录下面的另一个upload文件夹(/piwigo/_data/i/upload/),这只是有概率发生的,很多图片都没有缓存,如果在cv图片地址的时候像我已有cv到了缓存地址,那么未来可能因为某些原因缓存被清除了导致图片显示不出来
  • 问题分析出来了就好解决了,第一个办法就是全部手动把链接改成api调用的格式或者直接访问原文件的格式,但是以前的图片有点多,肯定是不方便改的
  • 注意到piwigo的三个目录的链接其实变的不多
无水印的原图片 /piwigo/upload/1.jpg
有水印的新图片 /piwigo/i.php?/upload/1.jpg
无法显示的图片 /piwigo/_data/i/upload/1.jpg
  • 所以我们可以直接用.htaccess+正则匹配进行路径重写(我是apache,如果是nginx用伪静态也能实现)
.htaccess(Hypertext Access)是一个用于配置和控制网站目录的配置文件。它是在 Apache Web服务器上使用的一种常见
文件,用于实现网站的重定向、URL重写、访问权限控制、错误处理等功能。

以下是.htaccess文件的一些主要特点和用途:

重定向和URL重写:通过.htaccess文件,您可以创建重定向规则,将特定的URL重定向到其他URL。您还可以使用正则表达式和
变量来实现URL重写,将复杂的URL转换为更友好和易于记忆的形式。

访问权限控制:通过.htaccess文件,您可以限制对特定目录或文件的访问权限。您可以设置密码保护,要求用户提供用户名和
密码才能访问受限资源。

自定义错误页面:您可以使用.htaccess文件来定义自定义错误页面,以便在发生错误时向用户显示更友好和个性化的错误消息。

缓存控制:通过.htaccess文件,您可以设置缓存策略,控制浏览器对网站资源的缓存行为,从而提高网站的加载速度和性能。

防止目录列表显示:通过.htaccess文件,您可以禁止服务器显示目录列表,以增加网站的安全性和隐私性。

.htaccess文件通常放置在网站的根目录中,但也可以放置在子目录中,以实现特定目录的配置。需要注意的是,.htaccess文
件的修改可能会影响网站的功能和性能,因此在进行修改之前建议备份文件,并咨询网站管理员或开发人员的建议。
  • 实际上.htaccess的正则语法和python的re很像,^匹配请求开头,$匹配请求结尾,()用来包裹捕获组,$1表示第一个捕获组的内容,.htaccess所匹配到的路径与.htaccess文件所在的路径有关,比如访问a.com/1/2/,如果.htaccess文件在根目录a.com/,那么受匹配的字符串是/1/2/,如果放在a.com/1/目录下面,受匹配的字符串是/2/
  • 这里不过多展开.htaccess的语法,将下面文件写入.htaccess,放在/piwigo/_data/i/upload/目录下面,正则匹配图片的名称,放在新链接里面.这里是不用匹配后缀的,因为缓存的后缀和实际本地存储的后缀是肯定一样的
RewriteEngine On
RewriteRule ^(.*)$ /piwigo/i.php?/upload/$1 [L,R=301]
  • 将下面文件写入.htaccess,放在/piwigo/upload/目录下面,匹配图片的名称和后缀,并加上-xx,
RewriteEngine On
RewriteRule ^(.*)\.(.*)$ /wordpress/7/i.php?/upload/$1-xx.$2 [L,R=301]
  • 这样就能实现将三类请求都重定向到piwigo的i.php,可以满足所有图片(包括以前的)都有水印.如果担心i.php的并发请求过高导致卡顿,也可以稍微改一下,全部重定向到本地的原文件.经过测试,小并发的请求基本上没啥卡顿,反正都是懒加载,并且我的博客也没几个人看🥺
  • 最后贴一份常用的.htaccess语法规则吧
1.重定向规则:将特定URL重定向到另一个URL。

Redirect 301 /old-page.html /new-page.html
这个例子将/old-page.html重定向到/new-page.html。数字301表示永久重定向,告诉搜索引擎和浏览器该页面已永久移
动。

2.URL重写规则:将复杂的URL转换为更友好和易于记忆的形式。

RewriteEngine On
RewriteRule ^blog/([a-zA-Z0-9-]+)/?$ /index.php?page=blog&slug=\$1 [NC,L]
这个例子将/blog/some-article重写为/index.php?page=blog&slug=some-article。^blog/([a-zA-Z0-9-]+)/?$是一个
正则表达式模式,匹配以blog/开头,后跟一个或多个字母、数字或破折号的URL。[NC,L]是修饰符,NC表示不区分大小写,L
表示停止处理后续规则。

3.访问权限控制:限制对特定目录或文件的访问权限。

AuthType Basic
AuthName "Restricted Area"
AuthUserFile /path/to/.htpasswd
Require valid-user
这个例子启用基本身份验证,并指定了一个叫做"Restricted Area"的验证区域。AuthUserFile指定了存储用户名和密码
的.htpasswd文件的路径。Require valid-user要求用户提供有效的用户名和密码才能访问受限资源。

4.自定义错误页面:定义自定义错误页面。

ErrorDocument 404 /errors/not-found.html
ErrorDocument 500 /errors/internal-server-error.html
这个例子将404错误重定向到/errors/not-found.html页面,将500错误重定向到/errors/internal-server-error.html
页面。您可以根据需要定义其他错误页面。

5.防止目录列表显示:禁止服务器显示目录列表。

Options -Indexes
这个例子禁用了目录列表功能,当访问一个没有默认首页的目录时,服务器将返回403 Forbidden错误。

6.禁止访问特定文件或目录:阻止对特定文件或目录的访问。

Deny from all
这个例子将禁止对当前目录下的所有文件和子目录的访问。您可以使用其他规则来指定要禁止访问的特定文件或目录。也可以用allow关键字,后面可以加ip或者网段,多条规则冲突时越往下优先级越高,所有一般可以先加Deny from all,然后allow某个
ip实现ip的访问限制

7.启用gzip压缩:启用服务器端的gzip压缩,减小传输的文件大小。

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain text/html text/css application/javascript
</IfModule>
这个例子使用mod_deflate模块启用gzip压缩。它将对文本文件(如纯文本、HTML、CSS和JavaScript)进行压缩。

8.设置默认文档:指定默认的索引文件。

DirectoryIndex index.html index.php
这个例子指定了默认的索引文件顺序,如果访问一个目录而没有指定文件名,服务器将尝试按照指定的顺序查找并返回第一个
存在的文件。

9.设置文件扩展名的处理方式:将某些文件扩展名映射到特定的处理方式。

AddType application/x-httpd-php .php
这个例子将.php文件扩展名与PHP解释器相关联,告诉服务器将这些文件作为PHP脚本来处理。

10.设置请求超时时间:指定服务器等待请求的超时时间。

Timeout 60
这个例子将请求的超时时间设置为60秒。如果服务器在60秒内没有收到完整的请求,它将关闭连接。
届ける言葉を今は育ててる
最后更新于 2024-02-11