如何防止 PHP 站点的浏览器缓存

我有一个在云服务器上运行的 php 站点。每当我添加新的文件 css,js 或图像浏览器正在加载相同的旧 js,css 和图像文件存储在缓存。

我的网站有一个 doctype 和 meta 标签,如下所示

<!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)">

由于上述 doctype 和 meta 代码,我加载相同的文件缓存在浏览器中,而不是新的一个

300805 次浏览

试试这个

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

在这里,如果你想通过 HTML 控制它: 像下面的 选择1:

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

如果你想通过 PHP 控制它: 像下面的 选择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');

选择二总是更好,以避免基于代理的缓存问题。

你可以试试这个:

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

如果有的话,希望它能帮助防止 Cache!

我缓存 CSS 文件时出了点问题。用 PHP 设置头文件对我没有帮助(也许是因为头文件需要在样式表文件中设置,而不是在链接到它的页面中设置?).

我在这一页找到了解决方案: https://css-tricks.com/can-we-prevent-css-caching/

解决办法:

追加时间戳作为链接文件的 URI 的查询部分。
(可用于 css、 js、图像等)

促进发展:

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

对于生产环境(缓存在很大程度上是一件好事) :

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(并在需要时手动重写)

或者两者的结合:

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

编辑:

或者两者更好的结合:

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

根据具体情况,防止浏览器缓存不是一个好主意。 在寻找解决方案时,我发现了这样的解决方案:

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

这里的问题是,如果文件在服务器上的更新期间被覆盖(这是我的场景) ,那么缓存将被忽略,因为即使文件的内容相同,时间戳也会被修改。

我使用此解决方案强制浏览器只有在其内容被修改时才下载资产:

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

还可以对缓存的文件使用查询字符串。它不会影响您的样式和 js 文件的行为。

例如:

example.com/mystyle.css ->
example.com/mystyle.css?<?php echo random(1000, 5000); ?>

如果你不能用 php 进行更改,也许可以通过.htaccess 文件进行更改。

<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>