2012-11-30 39 views
68

Tôi có một trang web php đang chạy trên máy chủ đám mây.Khi bao giờ tôi thêm tệp mới css, js hoặc hình ảnh, trình duyệt đang tải các tệp cũ, css và hình ảnh được lưu trữ trong bộ nhớ cache.Làm thế nào để ngăn chặn bộ nhớ cache của trình duyệt cho trang web php

Trang web của tôi có một DOCTYPE và thẻ meta như sau

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
    <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)"> 
    <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)"> 
    <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)"> 
    <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)"> 

Do DOCTYPE trên và mã meta đang i tải các tập tin cùng một lưu trữ trong trình duyệt thay vì mới một

+0

[ 'Không Cache trong tất cả Browsers'] (http: // stackoverflow.com/questions/1341089/sử dụng-meta-thẻ-to-turn-off-caching-trong-tất cả các trình duyệt). Bạn cũng có thể làm một? RandomGeneratedNumber trên các tập tin bạn không muốn được lưu trữ. – Kodemon

+0

Có thể bạn không muốn tắt hoàn toàn bộ nhớ cache cho hình ảnh/js/css: http://stackoverflow.com/questions/4206224/better-way-to-prevent-browser-caching-of-javascript-files – FoolishSeth

Trả lời

169

thử này

<?php 

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
?> 
+2

Cảm ơn bạn đã trả lời – ArrayOutOfBound

+5

Ngoại trừ "max-age = 0", đó là các tiêu đề được gửi bởi PHP mà không chỉ định ở trên trong cài đặt của tôi .. Có vẻ như PHP cố gắng ngăn chặn bộ nhớ đệm của trình duyệt theo mặc định ... –

+0

Bạn đã lưu nhiều từ tôi, cảm ơn bạn! –

21

Ở đây, nếu bạn muốn kiểm soát thông qua HTML: hãy làm như bên dưới Tùy chọn 1:

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/> 
<meta http-equiv="pragma" content="no-cache" /> 

Và nếu bạn muốn kiểm soát nó thông qua PHP: làm điều đó như dưới đây Phương án 2:

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 

Lựa chọn 2 luôn luôn tốt hơn để tránh Proxy dựa vấn đề bộ nhớ đệm.

5

Bạn có thể thử này:

header("Expires: Tue, 03 Jul 2001 06:00:00 GMT"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
    header("Cache-Control: post-check=0, pre-check=0", false); 
    header("Pragma: no-cache"); 
    header("Connection: close"); 

Hy vọng rằng nó sẽ giúp ngăn ngừa Cache, nếu có!

+0

Điều này chỉ liên quan đến bộ nhớ đệm của các tệp HTML phải không? Và không có gì để làm với eTag? Cảm ơn! –

+1

chỉ cần dòng đầu tiên là đủ hoàn hảo. Dòng thứ 5 thực sự là sai và không có gì để làm trong một phản hồi của máy chủ (nó là một tiêu đề yêu cầu). dòng thứ sáu sẽ không có tác dụng gì. tôi có thể tiếp tục ... –

+0

Hãy làm - thú vị – pee2pee

2

Tôi gặp sự cố khi lưu vào bộ nhớ cache các tệp css của mình. Đặt tiêu đề trong PHP không giúp tôi (có lẽ vì các tiêu đề sẽ cần phải được đặt trong tệp biểu định kiểu thay vì trang liên kết đến nó?).

Tôi tìm thấy giải pháp trên trang này: https://css-tricks.com/can-we-prevent-css-caching/

Giải pháp:

Nối timestamp là phần truy vấn của URI cho các tập tin được liên kết.
(Có thể sử dụng cho css, js, hình ảnh vv)

Đối với phát triển:

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

Đối với sản xuất (trong đó bộ nhớ đệm chủ yếu là một điều tốt):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(và viết lại theo cách thủ công khi cần)

Hoặc kết hợp cả hai:

<?php 
    define("DEBUGGING", true); // or false in production enviroment 
?> 
<!-- ... --> 
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>"> 

EDIT:

Hoặc đẹp kết hợp của hai:

<?php 
    // Init 
    define("DEBUGGING", true); // or false in production enviroment 
    // Functions 
    function get_cache_prevent_string($always = false) { 
     return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : ""; 
    } 
?> 
<!-- ... --> 
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>"> 
Các vấn đề liên quan