[英].htaccess mod_rewrite: enabling caching via checking if file exists
我正在為動態生成的圖像實現緩存系統。 該腳本通過/img/type/param1/param2.png
,其中可能有多種類型,參數數量是可變的。 該腳本生成映像並將其轉儲到磁盤。
我想要.htaccess
規則,該規則在請求圖像生成腳本時:
到目前為止,我有一個稍微修改的邏輯:
如果有更好的方法可以做到這一點,我很想聽聽。 無論如何,我的.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.