SORU
23 EYLÜL 2008, Salı


Tarayıcılar önbelleğe CSS yeniden zorlamak için zarif bir yol JS dosyalar/nedir?

Bazı tarayıcılar (özellikle Firefox ve Opera) önbellekteki kopyalarını kullanarak çok gayretli olduğunu fark ettim .css ve .js dosyaları, tarayıcı oturumları arasında bile. Bu dosyalardan birini güncelleştirmek ne zaman bir soruna yol açar, ancak kullanıcının tarayıcı önbelleğe alınan kopya kullanmaya devam ediyor.

Kullanıcının ne zaman değişti dosyasını yeniden yüklemek için tarayıcı zorlamak en zarif yolu nedir? soru:

İdeal çözüm tarayıcı sayfa her ziyaret dosyasını yeniden zorlamak olmaz. Cevap olarak benim çözümüm yayınlayacağız, ama daha iyi bir çözüm yolu vardır ve oylarınızı karar veririm, ben merak ediyorum.

Güncelleme:Burada tartışma bir süre izin verdikten sonra buldumJohn Eskişehir Osmangaziveda5idfaydalı olmak 'nın önerisi. Bunun için bir terim var çıkıyor: otomatik sürüm. Benim asıl çözüm bir arada ve John önerisi olan altına yeni bir cevap attılar.

Başka bir fikir tarafından önerildiSCdFdosyaya sahte bir sorgu dizesi eklemek olacaktır. (Otomatik olarak sahte bir sorgu dizesi olarak zaman damgası kullanmak için bazı Python kodu teslim oldupi.) Ancak, tarayıcı bir sorgu dizesi ile bir dosya önbelleği ki çalışıp çalışmadığı da ayrı bir tartışma yoktur. (Unutmayın, tarayıcı, dosya önbellek ve daha sonraki ziyaretlerinde kullanmak istiyoruz. Biz sadece değişmiş olan dosyayı yeniden getirmek istiyorum.) Sahte bir sorgu dizesi ile ne olduğu belli olmadığı için, bu cevabı kabul etmiyorum.

CEVAP
23 EYLÜL 2008, Salı


Güncelleme:Yeniden gelen önerileri de dahilJohn Eskişehir Osmangaziveda5id. Bu çözüm PHP ile yazılmış, ama kolayca diğer diller için adapte olmalıdır.

Güncelleme 2:Birleşmeyle gelen yorumlarNick Johnson.htaccess özgün düzenli json-1.3.js gibi dosyalar ile sorunlara neden olabilir. Çözüm tam sonunda 10 basamak ise sadece yeniden yazmak için. (Çünkü 10 haneli 11/20/2286. 9/9/2001 için) her zaman kapsar

İlk olarak, aşağıdaki yeniden yazma kuralı kullanırız .debug:

RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L]

Şimdi, aşağıdaki PHP fonksiyonunu yazalım:

/**
 *  Given a file, i.e. /css/base.css, replaces it with a string containing the
 *  file's mtime, i.e. /css/base.1221534296.css.
 *  
 *  @param $file  The file to be loaded.  Must be an absolute path (i.e.
 *                starting with slash).
 */
function auto_version($file)
{
  if(strpos($file, '/') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'] . $file))
    return $file;

  $mtime = filemtime($_SERVER['DOCUMENT_ROOT'] . $file);
  return preg_replace('{\\.([^./] )$}', ".$mtime.\$1", $file);
}

CSS dahil her yerde şimdi, bu değiştirin:

<link rel="stylesheet" href="/css/base.css" type="text/css" />

Bunun için:

<link rel="stylesheet" href="<?php echo auto_version('/css/base.css'); ?>" type="text/css" />

Bu gidişle asla bağlantı etiketi tekrar değiştirmek zorunda, ve kullanıcı her zaman en son CSS göreceksiniz. Tarayıcı CSS tarayıcı kullanmak istemiyorum yeni bir URL olarak görüyorum, CSS değişiklikleri önbelleğe alınan kopyasını, dosya, ama önbellek edebilecektir.

Bu görüntüler, ayrıca site simgeleri, ve JavaScript ile çalışabilir. Temelde dinamik olmayan bir şey oluşturdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • sonia989

    sonia989

    26 EKİM 2006