2013-04-15 22 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和創建的映像本身發回給瀏覽器。當下次請求圖像時不應該調用它。