0

我有一个问题,我们从各种 html 源和直接图像请求加载图像,并且发生“文件不存在”。不幸的是,这是由于许多已调整大小/缓存的图像在此应用程序的缓存清理过程中被破坏,因此必须重新生成。对较小图像的直接 http 请求只会返回一个错误,因为 Apache 除了文件消失之外没有什么不同。

如果出现错误,我想编写一个脚本来重新生成这些图像。换句话说,如果请求特定的原始图像,则会触发错误,然后调用脚本从原始图像重新生成有问题的图像,然后将提供缓存的图像。如何使用 httpd 进行设置?

这是错误日志的片段:

[Mon Apr 15 13:51:36 2013] [error] [client xxx.xxx.xxx.xxx] File does not exist: /home/username/public_html/domain.tld/media/catalog/product/cache/1/small_image/180x180/4da38bab36523d0886e53b8d57126395/h/k/hk0412.jpg
[Mon Apr 15 13:57:24 2013] [error] [client xxx.xxx.xxx.xxx] File does not exist: /home/username/public_html/domain.tld/media/catalog/product/cache/1/image/4da38bab36523d0886e53b8d57126395/n/c/nca20212.jpg
[Mon Apr 15 13:57:47 2013] [error] [client xxx.xxx.xxx.xxx] File does not exist: /home/username/public_html/domain.tld/media/catalog/product/cache/1/image/4da38bab36523d0886e53b8d57126395/v/z/vz0612.jpg
[Mon Apr 15 13:58:42 2013] [error] [client xxx.xxx.xxx.xxx] File does not exist: /home/username/public_html/domain.tld/media/catalog/product/cache/1/small_image/220x220/4da38bab36523d0886e53b8d57126395/R/A/RA01112.jpg
4

2 回答 2

2

例如,如果请求 URL 包含/cache/images/abc.jpg,你可以重写一些 PHP 脚本,如果它不存在

# if the file exists, just send it
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^cache/image/.*$ - [L]

# if it doesn't exists, rewrite to PHP script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cache/image/.*$ /path/to/script.php?url=$0 [L]

script.php重新生成图像并将其发送给客户端。

于 2013-04-15T20:28:04.603 回答
2

如果图像不存在,Apache 将触发一个 404 错误页面,您可以将其用于此目的。您可能希望避免在每个请求上触发 PHP 脚本,或者必须使用重写规则检查文件是否存在。

ErrorDocument 404 /reCacheImage.php

将类似的内容放在配置中,或者放在 vhost 的目录容器中,或者放在缺少图像的目录中的 .htaccess 中。如果他们不请求任何图像,则无需使用您的脚本回答所有 404 情况。

然后,您的脚本可以创建缓存版本,存储到磁盘,并将状态 200 和创建的图像本身发送回浏览器。下次请求图像时不应调用它。

于 2013-04-15T20:46:58.913 回答