2013-09-23 93 views
1

我們目前使用用PHP編寫的圖像調整器。調整大小腳本利用緩存,並將生成的調整大小的圖像寫入緩存目錄(正確地命名爲cache/)。基於文件存在與其他名稱的重寫規則

的過程是這樣的重寫URL,例如:
domain.com/img/250x250/some-image.jpg

將被改寫到:
domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop

裏面image.php,我們做一個檢查,看看是否匹配文件在cache/ dir中調整大小。所有緩存的圖像存儲與cachFunctionWidth_height_originalName的名稱,所以對於給定的例子裏面cache/生成的圖像文件將被命名爲resizecrop250_250_some-image.jpg

目前,我們正在利用PHP的fpassthru()功能,輸出的文件,如果它的瀏覽器存在。如果不是,我們使用GD函數和算法的組合將文件輸出到瀏覽器。

我的問題是,如果使用HTACCESS(它是Linux服務器)在cache目錄中存在已調整大小的圖像,是否可以完全繞過image.php。本質上,我們需要在重寫之前檢查一個混雜的名字形式。

例如,下面是我們想達到什麼樣的一些僞代碼,但我不認爲這是可能的:

  • 用戶要求文件> domain.com/img/250x250/some- image.jpg的
  • 檢查文件是否存在cache/resizecrop250_250_some-image.jpg
  • 如果是的話,重寫cache/resizecrop250_250_some-image.jpg
  • 如果沒有,改寫爲domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop

如果這不可能通過HTACCESS,任何其他建議也將受到歡迎。

+0

'我們做一個檢查,以查看文件是否調整大小相匹配的緩存/'爲什麼不是'/ IMG/250×/一些-image.jpg'緩存文件的位置?使用php而不是no-php幾乎肯定是次優解決方案,除非有一個未提到的要求 – AD7six

回答

2

我相信使用mod_rewrite是可能的。請考慮以下規則:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

# check if constructed image name exists in cache directory  
RewriteCond %{DOCUMENT_ROOT}/cache/resizecrop$1_$2_$3 -f 
# exists, redirect to cache/constructed-image-file-name 
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /cache/resizecrop$1_$2_$3 [L,NC] 

# doesn't exist then forward to image.php with required query parameters 
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /image.php?width=$1&height=$2&src=$3&function=resizeCrop [L,NC] 
+0

謝謝,這是一個很好的解決方案,正是我們所期待的! – BenM

+0

非常歡迎您,很高興它爲您解決。 – anubhava