2011-05-12 41 views
0

我現在有這個文件夾結構:重寫規則與文件檢查和調整圖像

img.domain.com/ 
    boats/ 
     boat1/ 
      1.jpg 
      2.jpg 
    trees/ 
     tree1/ 
      1.jpg 
      2.jpg 

我已經在img.domain.com/index.php是調整圖像大小和重寫規則使PHP腳本讓我訪問圖像(調整與否)是這樣的:img.domain.com/boats/boat1/1/200/200/a-big-boat.jpg

對於這個我使用:

RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC] 

這一切都很好。

我想要的是,使用PHP創建緩存圖像後,如果存在,則只能使用RewriteRule。我不想用PHP檢查文件。

我讀了這個問題(Best way to cache resized images using PHP and MySQL),有一個很好的解決方案:

RewriteCond %{REQUEST_URI} ^/images/cached/ 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteRule (.*) /images/generate.php?$1 [L] 

但我無法適應我的情況。

任何想法?

回答

0

我爲自己的問題找到了解決方案。

首先,PHP腳本必須在URL指向的位置創建緩存文件。這意味着,在調整圖像大小後,將其保存在該路徑上。

在我給出的示例中:img.domain.com/boats/boat1/1/200/200/a-big-boat.jpg(第一次調用時不存在)將在該路徑上保存圖像(img.domain.com/boats/boat1/1/200/200/),名稱爲a-big-boat.jpg,尺寸爲200x200。

現在和.htaccess:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC] 

它將請求圖像,如果不存在,調用的index.php這些參數和創建緩存。下一次,它將獲得緩存文件而不通過index.php。這個(.htaccess)比檢查文件是否存在於PHP中要好。

當然,RewriteRule只適用於我的情況。

只是爲了避免列出用戶試圖訪問img.domain.com/boats/1/200/或緩存系統創建的任何其他文件夾。把它作爲第一個重寫條件。

RewriteCond %{REQUEST_FILENAME} -d 
ErrorDocument 403 /forbidden.php 

警告!請注意尺寸和文件名。就我而言,由於最終文件名(a-big-boat.jpg)與原始文件(1.jpg)不同,用戶可以創建無限制的緩存文件,只需更改最終名稱即可。大小相同。

根據您設定的標準尺寸檢查所需的尺寸。至於名字,我會從數據庫中得到一個獨特的名字。這將每個圖像/大小隻檢查一次數據庫,並且不會在緩存後再次檢查,所以這不是問題。如果名稱正確,則創建緩存,如果不發送到「找不到圖像」。

我希望這可以幫助其他人。