2013-04-15 25 views
0

我有一个问题,我们有图像加载从各种html源和直接图像请求和“文件不存在”正在发生。不幸的是,这是由于在这个应用程序的缓存清理过程中已经调整大小/缓存的许多图像,因此必须重新生成。直接http请求较小的图像只是返回一个错误,因为除了文件不存在之外,Apache没有任何区别。如何触发[php]用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 
+0

你可以设置所有的jpg \ gif请求去一个PHP脚本,如果存在或创建将提供文件。不知道它是否是最好的想法 – 2013-04-15 20:13:37

回答

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

有没有必要把网址放在查询字符串中。该脚本将从$ _SERVER中知道请求的URL,并且不会混淆可能附加的任何其他查询字符串。否则,如果不仅更改路径,而且还更改查询字符串,请务必将[L,QSA]用于重写规则。 – Sven

+0

因此,对于需要重新生成的图像的某些实例,apache的error_log内输出的输出(这里是一个示例)(https://gist.github.com/ylluminate/b17430c126f576ec9ab8/raw/f9774a55105e5251144dfab951e1b81ac00bbc8f/gistfile1.txt) 。 @Sven解释过,对于在正则表达式中匹配这些特征的细节,你有什么想法? – ylluminate

+0

@ylluminate这取决于你,你喜欢哪种方式。两者都使用查询字符串或询问'$ _SERVER ['REQUEST_URI']'是访问请求URL的可行且合法的方式。为了增加'QSA',它不会受到伤害。但我认为,这也是一个人为的学术问题,因为图片URL请求通常不包含查询字符串。如果你确实有这样的请求,并且查询字符串在版本控制之外有一些意义,@Sven是正确的,你当然必须添加'QSA'。 –

2

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

ErrorDocument 404 /reCacheImage.php 

把东西像这样的配置,无论是在目录容器在你的虚拟主机,或在具有图像丢失的目录内的.htaccess。如果他们没有请求任何图像,则不需要用脚本回答所有404情况。

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