簡體   English   中英

.htaccess mod_rewrite:通過檢查文件是否存在來啟用緩存

[英].htaccess mod_rewrite: enabling caching via checking if file exists

我正在為動態生成的圖像實現緩存系統。 該腳本通過/img/type/param1/param2.png ,其中可能有多種類型,參數數量是可變的。 該腳本生成映像並將其轉儲到磁盤。

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

  1. 檢查是否存在緩存的文件
  2. 如果是這樣,則mod_rewrite到緩存的文件
  3. 如果沒有,則不執行任何操作以使腳本運行

到目前為止,我有一個稍微修改的邏輯:

  1. mod_rewrite到緩存文件所在的位置
  2. 檢查文件是否存在
  3. 如果不是,則mod_rewrite請求再次返回

如果有更好的方法可以做到這一點,我很想聽聽。 無論如何,我的.htaccess文件的相關部分是:

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

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

這似乎不太正確。 為了調試它,我在第一個RewriteRule之后插入了以下內容(目標頁面只是轉儲其輸入):

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上遇到了完全相同的“雙重匹配”問題,該問題將請求還原回非緩存版本。 但是,在第二個RewriteRule中添加[L]

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

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

產生內部服務器錯誤。

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

您擁有的第一個邏輯就是您想做的事情,它繞過了可能的循環問題。 您只需要從%{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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM