2012-11-30 13 views
68

Ich habe eine PHP-Site im Cloud-Server ausgeführt. Wenn ich neue Dateien css, js oder Bilder hinzufügen, lädt der Browser die gleichen alten js, css und Bilddateien im Cache gespeichert.So verhindern Browser-Cache für PHP-Site

hat Meine Seite eine Doctype und Meta-Tag, wie unten

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

Aufgrund der oben Doctype und Meta-Code bin ich die gleichen Dateien geladen werden, anstatt neuen

+0

[ 'No Cache in allen Browsers'] (http: // Stackoverflow.com/questions/1341089/using-Meta-Tags-abschalten-Caching-in-allen-Browsern). Sie können auch eine "randomGeneratedNumber" -Option für die Dateien ausführen, die nicht zwischengespeichert werden sollen. – Kodemon

+0

Sie möchten den Cache wahrscheinlich nicht komplett für images/js/css deaktivieren: http://stackoverflow.com/questions/4206224/better-way-to-prevent-browser-caching-of-jacascript-files – FoolishSeth

Antwort

169

in Browser im Cache gespeichert versuchen, diese

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

Danke für die Antwort – ArrayOutOfBound

+5

Mit Ausnahme von "max-age = 0", das sind die von PHP gesendeten Header ohne Angabe der oben genannten in meiner Installation .. Es scheint, dass PHP versucht, Browser-Caching standardmäßig zu verhindern ... –

+0

Sie haben viele von uns gespeichert ich, danke! –

21

Hier wird, wenn Sie es durch HTML steuern möchten: tun wie unten Option 1:

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

Und wenn Sie es durch PHP steuern möchten: Machen Sie es wie unten Option 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'); 

UND Option 2 immer besser ist, um Proxy-basiertes Caching Problem zu vermeiden.

5

Sie können dies versuchen:

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

Hoffentlich wird es Cache verhindern, wenn überhaupt!

+0

Das betrifft nur das Zwischenspeichern der HTML-Dateien richtig? Und hat nichts mit eTag zu tun? Vielen Dank! –

+1

nur die erste Zeile sollte perfekt sein. Die fünfte Zeile ist eigentlich falsch und hat in einer Serverantwort nichts zu tun (es ist ein Anforderungsheader). Die sechste Zeile hat keinen Effekt whyoverver. Ich könnte weitermachen ... –

+0

Bitte tun - aufregend – pee2pee

2

Ich hatte Probleme mit dem Cachen meiner CSS-Dateien. Das Setzen von Headern in PHP hat mir nicht geholfen (vielleicht weil die Header in der Stylesheet-Datei gesetzt werden müssten, anstatt auf die Seite, die mit ihr verlinkt ist?).

fand ich die Lösung auf dieser Seite: https://css-tricks.com/can-we-prevent-css-caching/

Die Lösung:

Anfügen Zeitstempel als die Abfrage Teil der URI für die verknüpfte Datei.

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

Für die Produktion (wo Caching meist eine gute Sache ist):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">

Für Entwicklung (kann für css, js, Bilder usw. verwendet werden) (und manuell neu schreiben, wenn es erforderlich ist)

Oder eine Kombination dieser beiden:

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

Oder schönere Kombination dieser beiden:

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