Bagaimana mencegah caching file http di Apache httpd (MAMP)

139

Saya sedang mengembangkan aplikasi Javascript satu halaman di MAMP. File template JavaScript dan HTML saya di-cache di antara permintaan.

Apakah ada cara sederhana untuk menunjukkan dalam MAMP bahwa saya ingin mencegah caching file http? Mungkin dengan .htaccessfile? Di mana saya menempatkan .htaccessatau memodifikasi host virtual untuk MAMP di Mac?

dmck
sumber

Jawaban:

318

Sudah mencoba ini? Harus bekerja di keduanya .htaccess, httpd.confdan di VirtualHost(biasanya ditempatkan di httpd-vhosts.confjika Anda telah memasukkannya dari httpd.conf Anda)

<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% Mencegah File dari di-cache

Ini mirip dengan bagaimana iklan google menggunakan header Cache-Control: private, x-gzip-ok = ""> untuk mencegah caching iklan oleh proxy dan klien.

Dari http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

Dan secara opsional tambahkan ekstensi untuk file templat yang Anda ambil jika Anda menggunakan ekstensi selain .htmluntuk itu.

Charlie Rudenstål
sumber
2
Terima kasih, ini berfungsi sangat baik dalam file .htaccess. Saya bisa melihat opsi kontrol cache ketika saya memeriksa header dan file saya muncul dengan http 200 bukannya 304 antara permintaan, hanya apa yang saya butuhkan.
dmck
2
Jangan lupa untuk menambahkan perintah LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
Bisakah saya menerapkan tajuk itu ke semua jenis file, alih-alih mendefinisikan ekstensi satu per satu?
Thariq Nugrohotomo
1
@ThariqNugrohotomo Ya itu mungkin! Itu ungkapan reguler, Anda dapat mencoba <filesMatch "\.+">atau<filesMatch ^>
Charlie Rudenstål
Saya tidak menggunakan MAMP tetapi Apache di server web. Saya juga harus mengaktifkan header dan berakhir modul pada instalasi Apache saya dengan mengetikkan "sudo a2enmod header" dan "sudo a2enmod kedaluwarsa", dan kemudian sudo service apache2 restart. Perintah / tag LoadModule dan IfModule tidak diperlukan - cukup abaikan bagian tag IfModule yang diurung di atas tetapi masih masuk ke pengaturan Header di antara mereka. -
andruo11
5

Berdasarkan contoh di sini: http://drupal.org/node/550488

Berikut ini mungkin akan berfungsi di .htaccess

 <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>
Frank Farmer
sumber
Sayangnya ini tidak berfungsi ketika saya meletakkan file .htaccess di direktori proyek saya. Saya tidak yakin apakah mod_expires aktif.
dmck
5
@ dmck: hapus bagian <IfModule mod_expires.c>dan </IfModule>.. jika mod_expires tidak diaktifkan, Anda akan mendapatkan kesalahan alih-alih arahan itu diam-diam diabaikan.
Stennie
Dalam direktori proyek, setiap kesalahan sintaksis kecil di sini dapat menyebabkan kesalahan 500.
SDsolar
3

Saya memiliki masalah yang sama, tetapi saya menemukan solusi yang bagus di sini: Hentikan caching untuk PHP 5.5.3 di MAMP

Pada dasarnya temukan file php.ini dan berikan komentar pada baris OPCache. Saya harap jawaban alternatif ini membantu orang lain juga.

acarito
sumber
3
itu adalah tentang caching PHP di sisi server, alias OPCache. Pertanyaannya adalah tentang file yang sedang di-cache oleh browser yang diminta melalui HTTP.
Flion
2

Tanpa mod_expires akan lebih sulit untuk mengatur header kedaluwarsa pada file Anda. Untuk apa pun yang dihasilkan, Anda tentu dapat mengatur beberapa header default pada jawabannya, melakukan pekerjaan mod_expires seperti itu:

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

(diambil dari: Stack Overflow jawaban dari @brianegge , di mana solusi mod_expires juga dijelaskan)

Sekarang ini tidak akan berfungsi untuk file statis , seperti file javascript Anda. Sedangkan untuk file statis hanya ada apache (tanpa modul kedaluwarsa) antara browser dan file sumber. Untuk mencegah caching file javascript, yang dilakukan di browser Anda, Anda dapat menggunakan token acak di akhir ur js, sesuatu seperti ?rd=45642111, sehingga url terlihat seperti:

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

Jika url ini pada halaman dihasilkan oleh file PHP Anda bisa menambahkan bagian acak dengan PHP. Ini cara pengacakan url dengan hanya menambahkan parameter string kueri acak adalah hal dasar sampai pengaturan tanpa cache dari permintaan ajax jQuery misalnya. Browser tidak akan menganggap 2 url memiliki string kueri yang berbeda, dan tidak akan pernah menggunakan versi cache.

EDIT

Perhatikan bahwa Anda juga harus menguji mod_headers . Jika Anda memiliki mod_headers, Anda mungkin dapat mengatur header Expires secara langsung dengan kata kunci Header .

regilero
sumber
Terima kasih, sayangnya saya tidak menggunakan file PHP apa pun. Saya akan melihat mod_headers dan menginstal mod_expires.
dmck
Bagaimana dengan mencegah caching file CSS?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
sumber
Itu bukan jawaban yang berkualitas baik. Cobalah untuk menjelaskan secara terperinci apa langkah-langkah untuk menyelesaikan masalah yang dilaporkan pada OP.
leopal