2012-11-30 137 views
68

我有一个php站点运行在云server.When我添加新文件css,js或图像浏览器正在加载相同的旧的js,css和图像文件存储在缓存中。如何防止浏览器缓存为PHP网站

我的网站有一个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)"> 

由于上述文档类型和元码的我是装的浏览器,而不是新的

+0

['所有Browsers'没有缓存(HTTP://计算器。COM /问题/ 1341089 /使用的元标签到关闭缓存功能于所有的浏览器)。你也可以对你不希望被缓存的文件执行一个?randomGeneratedNumber。 – Kodemon

+0

您可能不想完全禁用图像/ js/css的缓存:http://stackoverflow.com/questions/4206224/better-way-to-prevent-browser-caching-of-javascript-files – FoolishSeth

回答

169

缓存相同的文件试试这个

<?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

感谢回复 – ArrayOutOfBound

+5

除了“max-age = 0”之外,这些是由PHP发送的头文件,未在我的安装中指定上述内容..似乎PHP会默认阻止浏览器缓存... –

+0

您已经将许多我们的我,谢谢你! –

21

在这里,如果你想通过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'); 

选项2是为了避免基于代理缓存的问题总是更好。

5

你可以试试这个:

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

希望这将有助于防止缓存,如果有的话!

+0

这只适用于HTML文件的缓存吗?与eTag无关?谢谢! –

+1

只是第一行应该足够完美。第5行实际上是错误的,并且在服务器响应中无关(它是请求标题)。第六行将不起作用。我可以继续... –

+0

请做 - 令人兴奋 – pee2pee

2

我有缓存我的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(); ?>"> 
相关问题