Cách ngăn bộ đệm ẩn tệp http trong Apache httpd (MAMP)


139

Tôi đang phát triển một ứng dụng Javascript một trang trong MAMP. Các tệp mẫu JavaScript và HTML của tôi đang được lưu trữ giữa các yêu cầu.

Có cách nào đơn giản để chỉ ra trong MAMP rằng tôi muốn ngăn bộ đệm ẩn tập tin http không? Có thể với một .htaccesstập tin? Tôi phải đặt .htaccesshoặc sửa đổi máy chủ ảo cho MAMP trên Mac ở đâu?

Câu trả lời:


318

Đã thử điều này? Nên làm việc trong cả hai .htaccess, httpd.confvà trong một VirtualHost(thường được đặt trong httpd-vhosts.confnếu bạn đã bao gồm nó từ bạn 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% Ngăn chặn các tập tin được lưu trữ

Điều này tương tự như cách quảng cáo google sử dụng tiêu đề Cache-Control: private, x-gzip-ok = ""> để ngăn bộ nhớ cache của quảng cáo bởi proxy và máy khách.

Từ http://www.askapache.com/htaccess/USE-http-headers-with-htaccess.html

Và tùy ý thêm tiện ích mở rộng cho các tệp mẫu mà bạn đang truy xuất nếu bạn đang sử dụng tiện ích mở rộng khác với các tiện ích mở rộng .html.


2
Cảm ơn bạn, điều này hoạt động rất tốt trong một tập tin .htaccess. Tôi có thể thấy các tùy chọn kiểm soát bộ đệm khi tôi kiểm tra các tiêu đề và các tệp của tôi hiển thị với http 200 thay vì 304 giữa các yêu cầu, chỉ là những gì tôi cần.
dmck

2
Đừng quên thêm lệnh LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet

Tôi có thể áp dụng các tiêu đề đó cho tất cả các loại tệp, thay vì xác định từng phần mở rộng không?
Thariq Nugrohotomo

1
@ThariqNugrohotomo Vâng, điều đó là có thể! Đó là một biểu thức thông thường, bạn có thể thử <filesMatch "\.+">hoặc<filesMatch ^>
Charlie Rudenstål

Tôi không sử dụng MAMP mà là Apache trên máy chủ web. Tôi cũng phải kích hoạt các tiêu đề và hết hạn các mô-đun trên bản cài đặt Apache của mình bằng cách gõ "sudo a2enmod tiêu đề" và "sudo a2enmod hết hạn", và sau đó sudo dịch vụ apache2 khởi động lại. Các lệnh / thẻ LoadModule và IfModule không cần thiết - chỉ cần bỏ qua các phần thẻ IfModule được đặt dấu ngoặc ở trên nhưng vẫn nhập cài đặt Tiêu đề giữa chúng. -
andruo11

5

Dựa trên ví dụ ở đây: http://drupal.org/node/550488

Sau đây có thể sẽ làm việc trong .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>

Thật không may, điều này không hoạt động khi tôi đặt một tập tin .htaccess trong thư mục dự án của tôi. Tôi không chắc chắn nếu mod_Exires hoạt động.
dmck

5
@dmck: xóa phần <IfModule mod_expires.c></IfModule>phần .. nếu mod_Exires không được bật, bạn sẽ gặp lỗi thay vì những chỉ thị đó lặng lẽ bị bỏ qua.
Stennie

Trong một thư mục dự án, bất kỳ lỗi cú pháp nhỏ nào ở đây có thể gây ra lỗi 500.
SDsolar

3

Tôi đã có cùng một vấn đề, nhưng tôi đã tìm thấy một giải pháp tốt ở đây: Dừng bộ nhớ đệm cho PHP 5.5.3 trong MAMP

Về cơ bản tìm tệp php.ini và nhận xét các dòng OPCache. Tôi hy vọng câu trả lời thay thế này cũng giúp những người khác.


3
đó là về bộ nhớ đệm PHP ở phía máy chủ, còn gọi là OPCache. Câu hỏi là về các tệp được lưu trữ bởi trình duyệt được yêu cầu qua HTTP.
Flion

2

Nếu không có mod_Exires , sẽ khó hơn để đặt các tiêu đề hết hạn trên các tệp của bạn. Đối với mọi thứ được tạo, bạn chắc chắn có thể đặt một số tiêu đề mặc định cho câu trả lời, thực hiện công việc của mod_Exires như thế:

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

(lấy từ: Stack Overflow answer từ @brianegge , trong đó giải pháp cũng được giải thích)

Bây giờ điều này sẽ không làm việc cho các tệp tĩnh , như các tệp javascript của bạn. Đối với các tệp tĩnh, chỉ có apache (không có bất kỳ mô đun hết hạn nào) giữa trình duyệt và tệp nguồn. Để ngăn bộ nhớ cache của các tệp javascript, được thực hiện trên trình duyệt của bạn, bạn có thể sử dụng mã thông báo ngẫu nhiên ở cuối url js, đại loại như ?rd=45642111vậy, vì vậy url trông giống như:

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

Nếu url này trên trang được tạo bởi một tệp PHP, bạn chỉ cần thêm phần ngẫu nhiên bằng PHP. Cách ngẫu nhiên url này bằng cách đơn giản nối thêm các tham số chuỗi truy vấn ngẫu nhiên là ví dụ cơ bản về cài đặt no-cache của yêu cầu jQuery ajax. Trình duyệt sẽ không bao giờ coi 2 url có các chuỗi truy vấn khác nhau giống nhau và sẽ không bao giờ sử dụng phiên bản được lưu trong bộ nhớ cache.

BIÊN TẬP

Lưu ý rằng bạn nên kiểm tra mod_headers . Nếu bạn có mod_headers, bạn có thể đặt tiêu đề Hết hạn trực tiếp với từ khóa Header .


Cảm ơn, thật không may, tôi không sử dụng bất kỳ tệp PHP nào. Tôi sẽ xem xét mod_headers và cài đặt mod_Exires.
dmck

Điều gì về việc ngăn chặn bộ nhớ cache của các tệp CSS?
Aaron Franke

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

Đó không phải là một câu trả lời chất lượng tốt. Cố gắng giải thích chi tiết các bước để giải quyết vấn đề được báo cáo trên OP.
leopal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.