2013-10-17 125 views
1

我正在實現動態生成圖像的緩存系統。該腳本通過/img/type/param1/param2.png調用,其中可能有多種類型,參數數量可變。該腳本生成圖像並將其轉儲到磁盤。.htaccess mod_rewrite:通過檢查文件是否存在啓用緩存

我想.htaccess規則,請求圖像生成腳本時:

  1. 檢查,看是否有緩存文件存在
  2. 如果有的話,mod_rewrite的該高速緩存文件
  3. 如果沒有,別「噸做任何事情,這樣的腳本運行

我至今被稍微修改的邏輯:

  1. 的mod_rewrite到緩存文件將是
  2. 檢查,以查看該文件是否存在
  3. 如果不是,再次mod_rewrite的請求

如果有一個更好的方式來做到這一點,我d愛聽到它。在任何情況下,我的.htaccess文件的相關部分:

RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2 

RewriteCond /^(.*)$ !-f 
RewriteRule images/cache/(.*) /img/$1 

這看起來不太合適。調試它,我插入第一重寫規則後,下面的(目標頁面只是清除其輸入):

RewriteRule ^(.*)$ /htaccess.php?url=$1 [END] 

其結果是,我得到:

Array 
(
    [url] => /images/cache/a/l/300.png/a/l/300.png 
) 

我不明白爲什麼$2包含l/300.png/a/l/300.png而不僅僅是l/300.png

如果我將第一個RewriteRule更改爲包含[L],我會得到預期結果。但是,我在第二個RewriteRule上遇到完全相同的「雙重匹配」問題,該問題將請求恢復回非緩存版本。但是,將[L]添加到此第二個重寫規則中:

RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2 [L] 

RewriteCond /^(.*)$ !-f 
RewriteRule images/cache/(.*) /img/$1 [L] 

會產生內部服務器錯誤。

我在做什麼錯,我該如何解決這個問題?

回答

2

您擁有的第一個邏輯就是您想要做的事,即繞過可能的循環問題。您只需從%{REQUEST_URI}中提取相關位,然後使用%引用進行反向引用。因此,例如:

RewriteCond %{REQUEST_URI} ^/img/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/images/cache/%1 -f 
RewriteRule ^img/(.*)$ /images/cache/$1 [L] 

或使用您有正則表達式模式:

RewriteCond %{REQUEST_URI} ^/img/(type1|type2)/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/images/cache/%1/%2 -f 
RewriteRule ^img/(.*)$ /images/cache/$1 [L] 
+0

這完美地工作,非常感謝你。爲了我自己的教化,爲什麼我的努力沒有奏效? – Mala

+2

@Mala我不是100%肯定的,但你可能想用'RewriteCond%{REQUEST_FILENAME}替換'RewriteCond /^(.*)$!-f'!因爲新的URI是/ images/cache之一 –