2009-08-23 21 views
7

Bir RewriteCond'u herhangi bir http isteği başlığına kolayca yerleştirebileceğimizi biliyoruz. Ama gönderilecek yanıtı başlıklarını kontrol edebilir miyiz? Özellikle, Son değiştirilmiş bir?mod_rewrite RewriteCond Son değişikliklere göre mi? (.htaccess)

Yalnızca son değiştirilme tarihi 30 dakikadan eski olduğunda bir url yeniden yazmak istiyorum ve bu dizinden bir dosya istendiğinde her seferinde bir php dosyasına bu denetimi devretme yükünü ortadan kaldırmaya çalışıyorum.

Şimdiden teşekkürler!

cevap

0

Giden üstbilgiler, mod_rewrite'dan daha geç gerçekleşinceye kadar mevcut değildir. Ayrıca, mod_rewrite içine yerleştirilmiş herhangi bir dosya değiştirme zamanı denetimi işlevi yoktur, bu nedenle, söz konusu dosyanın değiştirilip değiştirilmediğini öğrenmek için, Harici Yeniden Yazma Programı çeşitliliğinin RewriteMap olmasını sağlayın.

Uygulamanızı doğru bir şekilde anlıyorsam, bu dizinde 30 dakikadan eski bir cron job silme dosyalarına sahip olmak ve bir dosya varolmayan durumda yeniden yazmak olabilir.

+0

Yeap, belli ki. Ama son değiştirilen başlık o zaman var, bu yüzden belki de bunun için bir şey olduğunu düşündüm. Tahminim yok :-( Cron'a gelince, tam olarak kaçınmaya çalışıyorum. –

8

Hayır, bu mümkün değil. Ancak, bu bilgiyi PHP'den daha az masraflı bir programdan almak için bir rewrite map kullanabilirsiniz, belki bir kabuk betiği olabilir. İşte

bir örnek betik görüyorsunuz: Program sadece bir kez başlatıldığında olarak yeniden yazma haritanın beyan ihtiyacı
#!/usr/bin/env bash 
while read line; do 
    max_age=${line%%:*} 
    filename=${line#*:} 
    if [[ -f $filename ]]; then 
     lm=$(stat -f %m "$filename") 
     if [[ $(date +%s)-$lm -le $max_age ]]; then 
      echo yes 
     else 
      echo no 
     fi 
    else 
     echo no 
    fi 
done 

sunucu veya sanal konak konfigurasyonu dosyasında yerleştirilecek ve giriş için bekler:

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh 

Ve sonra bunları (.htaccess örnekte) gibi bu yeniden yazma haritayı kullanabilirsiniz:

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes 
RewriteRule ^foo/bar$ - [L] 
RewriteRule ^foo/bar$ script.php [L] 
+0

Güzel bir çözüm var. –

+0

PHP halihazırda Apache işleminin içinde yüklü ve çalışıyor olduğundan, istek başına yeni bir bash - bir tane üretmenin daha hızlı olacağı net değil. Olmaz sanırım. – derobert

+0

Vay, bu akıllı! Zaman ayırdığınız için çok teşekkürler. Ancak, derobert'in yukarıdaki itirazından ne haber? –

0

Mod_proxy, mod_cache ve/veya squid'i kullanmayı düşündünüz mü? Kendi önbelleğe almayı denediğiniz gibi geliyor ...

+0

Yeap, bazı php/gd oluşturulmuş görüntüleri önbelleğe almaya çalışıyorum ve gerekirse her 30 dakikada bir yeniden oluşturmaya çalışıyorum. (= birisi gerçekten onları isterse) mod_proxy, mod_cache veya kalamarın size yardımcı olabileceğini düşünüyorsunuz? Onları hiç merak etmedim. Daha karmaşık şeyler için her zaman düşündüm. –

+0

Evet, önbellekleme yapıyorsunuz ve tam olarak bunun için tasarlandığı şeydir. Doğal olarak, eğer bu optimizasyon ile uğraşmanız gerekir (örneğin, gereken trafik hacmine sahip olursunuz). – derobert