如何使用Apache在错误查找图像时触发[php]脚本?

时间:2013-04-15 20:10:39

标签: php apache .htaccess magento

我有一个问题,我们从各种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

2 个答案:

答案 0 :(得分: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重新生成图像并将其发送给客户端。

答案 1 :(得分:2)

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

ErrorDocument 404 /reCacheImage.php

在配置中放置这样的内容,无论是在vhost的目录容器中,还是在缺少图像的目录内的.htaccess中。如果他们没有请求任何图像,则无需使用脚本回答所有404情况。

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