Câu hỏi Làm thế nào để ngăn chặn bộ nhớ cache của trình duyệt cho trang web php


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

Trang web của tôi có một loại tài liệu và thẻ meta như bên dưới

<!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 và mã meta ở trên tôi đang tải cùng một tệp được lưu trong trình duyệt thay vì tệp mới


76
2017-11-30 06:26


gốc


No Cache in all Browsers. 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
Có thể bạn không muốn tắt hoàn toàn bộ nhớ cache cho hình ảnh / js / css: stackoverflow.com/questions/4206224/… - FoolishSeth


Các câu trả lời:


thử cái 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");
?>

185
2017-11-30 06:33



Cảm ơn vi đa trả lơi - ArrayOutOfBound
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 ... - fast-reflexes
Bạn đã lưu rất nhiều của chúng tôi từ tôi, cảm ơn bạn! - Wallysson Nunes
Tôi có một plugin WordPress gửi một chủ đề thay thế cho các phiên bản cũ của Internet Explorer và nó đã bị vấp ngã trên một số hệ thống bộ nhớ đệm. Bài đăng này xuất hiện trên tìm kiếm Google đầu tiên của tôi. Vâng chơi. - Imperative
Lưu ý: Nếu bạn sử dụng session_start() sau đó, nó sẽ ghi đè tiêu đề của bạn bằng Cache-Control: private, max-age=10800, pre-check=10800 bởi vì 180 phút là giá trị mặc định của session.cache_expire. Nếu bạn không thể tránh bắt đầu phiên, nhưng bạn cần vô hiệu hóa việc sử dụng bộ nhớ cache session_cache_limiter('private');session_cache_expire(0);. - mgutt


Ở đây, nếu bạn muốn kiểm soát nó thông qua HTML: làm như dưới đây Lựa 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: hãy làm như sau Lựa chọ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 IS luôn luôn TỐT HƠN để tránh vấn đề bộ đệm ẩn dựa trên proxy.


22
2018-02-06 17:17





Bạn có thể thử điều 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 chặn Cache, nếu có!


6
2018-01-27 10:56



Điều này chỉ liên quan đến bộ nhớ đệm của các tập tin HTML phải không? Và không có gì để làm với eTag? Cảm ơn! - Sam Levin
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... - The Surrican
Làm ơn - thú vị - pee2pee


Tôi đã có vấn đề với bộ nhớ đệm của tôi tập tin css. Đặ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:

Thêm dấu thời gian làm phần truy vấn của URI cho tệp được liên kết.
(Có thể được sử dụng cho css, js, hình ảnh, v.v.)

Cho sự 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 (nơi 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 thủ công khi nó được yêu cầu)

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') : ""; ?>">

CHỈNH SỬA:

Hoặc kết hợp đẹp hơn của hai loại đó:

<?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(); ?>">

3
2017-10-12 13:11





Ngăn chặn bộ nhớ cache của trình duyệt không phải là một ý tưởng tốt tùy thuộc vào từng trường hợp. Tìm kiếm một giải pháp tôi tìm thấy các giải pháp như thế này:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

vấn đề ở đây là nếu tập tin bị ghi đè trong khi cập nhật trên máy chủ, đó là kịch bản của tôi, bộ nhớ cache bị bỏ qua vì dấu thời gian được sửa đổi ngay cả nội dung của tệp cũng giống nhau.

Tôi sử dụng giải pháp này để buộc trình duyệt tải xuống nội dung chỉ khi nội dung của nó được sửa đổi:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">

0
2018-06-21 19:01