Apache httpd'de (MAMP) http dosyasının önbelleğe alınmasını önleme


139

MAMP tek bir sayfa Javascript uygulaması geliştiriyorum. JavaScript ve HTML şablon dosyalarım istekler arasında önbelleğe alınıyor.

MAMP'te http dosya önbelleğini önlemek istediğimi göstermek için basit bir yolu var mı? Muhtemelen bir .htaccessdosyayla mı? .htaccessMac'te MAMP için sanal ana bilgisayarı nereye yerleştirebilir veya değiştirebilirim?

Yanıtlar:


318

Bunu denedin mi? Her iki çalışacak mı .htaccess, httpd.confve bir de VirtualHost(genellikle yerleştirilir içinde httpd-vhosts.confsen onu dahil ettik eğer senin httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

% 100 Dosyaların önbelleğe alınmasını engelleyin

Bu, reklamların proxy'ler ve istemciler tarafından önbelleğe alınmasını önlemek için Google reklamlarının Cache-Control: private, x-gzip-ok = ""> üstbilgisini nasıl kullandığına benzer.

Gönderen http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

Ve isteğe bağlı olarak .html, bunlardan başka bir uzantı kullanıyorsanız, almakta olduğunuz şablon dosyaları için uzantı ekleyin .


2
Teşekkür ederim, bu bir .htaccess dosyasında çok iyi çalışıyor. Başlıkları incelediğimde önbellek kontrol seçeneklerini görebiliyorum ve dosyalarım istekler arasında 304 yerine http 200 ile gösteriliyor, tam da ihtiyacım olan şey.
dmck

2
LoadModule komutunu eklemeyi unutmayın. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet

Bu başlığı uzantıları tek tek tanımlamak yerine tüm dosya türlerine uygulayabilir miyim?
Thariq Nugrohotomo

1
@ThariqNugrohotomo Evet, mümkün! Düzenli bir ifade, deneyebilirsiniz <filesMatch "\.+">veya<filesMatch ^>
Charlie Rudenstål

MAMP kullanmıyorum ama bir web sunucusunda Apache kullanıyorum. Ayrıca "sudo a2enmod üstbilgileri" ve "sudo a2enmod süresinin dolması" yazarak Apache kurulumumdaki üstbilgileri ve son kullanma tarihi modüllerini etkinleştirmem gerekiyordu ve sudo service apache2 restart. LoadModule ve IfModule komutları / etiketleri gerekli değildi; yukarıdaki köşeli ayraçlı IfModule etiketi parçalarını atlamanız yeterli, ancak yine de bunların arasında Başlık ayarlarını girin. -
andruo11

5

Buradaki örneğe dayanarak: http://drupal.org/node/550488

Aşağıdakiler muhtemelen .htaccess içinde çalışacaktır

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>

Proje dizinime bir .htaccess dosyası koyduğumda maalesef bu çalışmıyor. Mod_expires aktif olup olmadığından emin değilim.
dmck

5
@dmck: <IfModule mod_expires.c>ve </IfModule>bölümü kaldırın .. mod_expires etkin değilse, bu yönergeler sessizce yoksayılmak yerine bir hata alırsınız.
Stennie

Bir proje dizininde, burada herhangi bir küçük sözdizimi hatası 500 hatasına neden olabilir.
SDsolar

3

Aynı sorunu vardı, ama burada iyi bir çözüm buldum: MAMP PHP 5.5.3 için önbelleğe almayı durdur

Temel olarak php.ini dosyasını bulun ve OPCache satırlarını yorumlayın. Umarım bu alternatif cevap başkalarına da yardımcı olur.


3
yani sunucu tarafında PHP önbellekleme, yani OPCache. Soru, HTTP tarafından istenen tarayıcı tarafından önbelleğe alınan dosyalar hakkındadır.
Flion

2

Mod_expires olmadığında, dosyalarınızda son kullanma üstbilgileri ayarlamak daha zor olacaktır. Oluşturulan herhangi bir şey için, kesinlikle mod_expires işini yaparak cevaba bazı varsayılan başlıklar ayarlayabilirsiniz:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

( kaynağından alınmıştır: mod_expires çözümünün de açıklandığı @ brianegge'den Stack Overflow cevabı )

Artık bu, javascript dosyalarınız gibi statik dosyalar için çalışmaz . Statik dosyalara gelince, tarayıcı ve kaynak dosya arasında sadece bir apache (herhangi bir son kullanma modülü olmadan) vardır. Tarayıcınızda yapılan javascript dosyalarının önbelleğe alınmasını önlemek için , js url'sinin sonunda rastgele bir simge kullanabilirsiniz ?rd=45642111, böylece URL şöyle görünür:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

Sayfadaki bu url bir PHP dosyası tarafından oluşturulmuşsa, rastgele kısmı PHP ile ekleyebilirsiniz. Sadece rastgele sorgu dizesi parametreleri ekleyerek url'yi rasgeleleştirmenin bu yolu, örneğin ajax jQuery isteğinin önbelleksiz ayarının temelini oluşturur. Tarayıcı, farklı sorgu dizelerine sahip 2 URL'yi asla aynı kabul etmeyecek ve hiçbir zaman önbelleğe alınmış sürümü kullanmayacaktır.

DÜZENLE

Test ALOS gerektiğini Not mod_headers . Mod_headers'ınız varsa, Expires üstbilgilerini doğrudan Header anahtar sözcüğü ile ayarlayabilirsiniz .


Teşekkürler, ne yazık ki herhangi bir PHP dosyası kullanmıyorum. Ben mod_headers ve mod_expires yükleme içine bakacağız.
dmck

CSS dosyalarının önbelleğe alınmasını önlemeye ne dersiniz?
Aaron Franke

1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>

Bu kaliteli bir cevap değil. OP'de bildirilen sorunun çözümüne yönelik adımların neler olduğunu ayrıntılı olarak açıklamaya çalışın.
leopar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.