2009-12-21 14 views
9

Etwas, ich denke, Apache, fügt diese HTTP-Header für alle Antworten, die von PHP-Skripte generiert:PHP entfernen HTTP-Header

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Diese für die tatsächliche dynamische Seiten funktioniert ok, aber ich habe einige Seite, die zwar erzeugt durch PHP, sind meist statisch, und ich möchte, dass der Browser sie zwischenspeichert.

Gibt es eine Möglichkeit in PHP, diese Header aus der Antwort zu entfernen und so die Standard-Caching-Regeln des Browsers zu aktivieren, oder wenn nicht, gibt es irgendeinen Wert, den ich ihnen zuweisen kann, der abwesend ist?

Ich würde es vorziehen, meine eigenen Werte nicht zu setzen, weil ich möchte, dass der Browser die gleichen Caching-Regeln wie für statische Ressourcen verwendet, die von Apache selbst bedient werden (ohne mod_cache).

Antwort

2

Zuerst würde ich überprüfen, ob es wirklich eines der PHP-Skripte ist, die diese Header setzt.

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

Drucken Sie etwas "verwendbar" auf Ihrem Server?

+1

Ich habe die Nachforschungen gemacht, und es scheint, dass PHP die Header setzt, wenn ich die Session-Funktionen nutze um die relevanten Dokumente Es gibt Möglichkeiten, den Wert der Header zu ändern, aber nicht zu verhindern, dass sie festgelegt werden –

+2

Tatsächlich, session.cache_limit auf "keine" (undokumentierter Wert) zu beheben, löste es. Siehe http://stackoverflow.com/questions/681115/cache-control-header-modified-by-php-session –

+0

wow, daran hätte ich schon ewig nicht gedacht ;-) – VolkerK

2

Sie können HTTP-Header manuell über die Funktion aus PHP bereitstellen.

Ich würde mir vorstellen, dass dies die Standard-Header-Werte des Webservers deaktivieren sollte.

+0

Wenn ich sie auf eine leere Zeichenfolge, z. "Cache-Control:", interpretieren Browser dies genauso wie wenn es abwesend ist? –

+0

Sind Sie sicher, dass PHP nicht nur die Kopfzeilen hinzufügt, sondern einen komplett neuen Header generiert? – dusoft

+0

Das Standardverhalten besteht darin, vorhandene Header mit demselben Namen zu ersetzen, wie in der Dokumentation für header() zu sehen. –

7

Für diese bestimmten Dateien könnten Sie header() -Aufrufe hinzufügen, die diese Header unterschiedlich setzen. dh. header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

Wenn möglich, möchte ich die Header wirklich entfernen, so dass das Verhalten des Browsers genauso ist wie bei normalen statischen Dateien auf einem nicht konfigurierten Server. –

+0

Da dies außerhalb der PHP-Umgebung passiert, ist es nicht leicht, mit einem anderen Wert zu überschreiben. Ich verwende normalerweise lächerliche Ablaufdaten für statischen Inhalt (10 Jahre gelesen), um den Inhalt zwischenzuspeichern. – Myles

+1

Ich bin besorgt, dass, wenn ich es auf ein Datum 10 Jahre in der Zukunft setze, Änderungen tatsächlich nicht von den Benutzern abgeholt werden. –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

oder einige ebenso absurd Zeit in der fernen Zukunft. Denken Sie daran, Ihre Kopfzeilenwerte festzulegen, bevor eine Ausgabe gesendet wurde, es sei denn, Sie führen eine Pufferung der Ausgabe für Ihre gesamte Seite durch.

http://php.net/manual/en/function.header.php

0

Unterdrückungs, dass der Cache kann wie folgt vorgenommen werden: PHP-Code:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 

, wenn Sie wollen, dass es automatisch generieren, können Sie dann diese hier: PHP: session_cache_limiter() - Handbuch sie

+0

Dies ist genau das, was ich verhindern möchte –

+0

tut mir leid, aber Sie haben keinen Zugriff auf die Browser-Cache-Rollen, so dass Sie verwenden müssen http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

Ich habe dies nicht versucht, aber Sie könnten wahrscheinlich speichern solche Seiten als HTML-Dateien mit Ihren benutzerdefinierten Kopfzeilen oder fehlende von-von und das Skript könnte innerhalb der

01 ausgeführt werden
0

Es ist wahrscheinlich irgendwo in Ihrem Code, dass diese Variablen gesetzt haben, wie ich nicht finden kann, wo sie automatisch von PHP irgendwo eingefügt werden, noch sind sie in einer meiner LAMP-Installationen. Die einzige automatisch generierte Kopfzeile für meine Installationen ist X-Powered-By mit der PHP-Version.

Wie Sie gesagt haben, von dem docs sie empfehlen, sagen header("Expires:"); die alten Header zu ersetzen, aber header("Cache-control:"); wurden nur Cache-Control: max-age=0 in meinem Browser (so ist dies nicht das, was Sie zu tun versuchen).

Ich würde empfehlen zu überprüfen, ob diese Werte von einem Framework oder einer Einstellung kommen, die Sie geändert haben, aber es kann sich in verschiedenen Versionen von PHP/Plattformen, auf denen Sie PHP laufen, unterscheiden.

Ich würde nach ExpiresByType oder ExpiresDefault Direktiven in globalen Konfigurationen, vhosts, pr überprüfen..htaccess-Dateien oder alle gekapselten Blöcke in <IfModule mod_expires> oder <IfModule mod_expires.c>

„Ich mag der Browser die gleichen Cache-Regeln wie für statische Ressourcen verwenden, die von Apache selbst (ohne mod_cache) bedient werden.“

Versuchen Sie, eine statische Ressource zu betrachten und dann die Regeln zu erfüllen. Sie können das Expires offest damit berechnen ->http://www.php.net/manual/en/function.header.php#93377

+0

Ich bin sicher, dass die Header nicht in PHP festgelegt sind. @ "Versuchen Sie, eine statische Ressource zu betrachten und dann die Regeln zu erfüllen.": Das ist der Punkt, sie haben diese Header nicht;) –

+0

Lassen Sie mich dies für Sie einfacher machen, "gibt es einen Wert, den ich ihnen setzen kann das ist gleichbedeutend damit, dass sie abwesend sind?" nicht wirklich. (Leer) wird von jedem Browser interpretted werden. ‚Ich würde es vorziehen, nicht meine eigenen Werte‘ das ist unmöglich, wie Sie oder Ihr Gastgeber bereits irgendwo haben. –

+0

Ok, ich war sicher, dass die Header wurden nicht von meinem Code gesetzt, aber anscheinend werden sie von PHP gesetzt, wenn Sie ihre Sessions benutzen. Siehe meinen Kommentar @VolkerK –

1

Diese Cache-Header gesendet werden, wenn Sie Sitzungen und stellen Sie beginnen zu „nocache“ durch Standard; Dies stellt sicher, dass jede Anfrage konsistente Ergebnisse liefert.

Wenn Sie beispielsweise ein Warenkorbsystem haben und Ihr Browser /add?product=xyz zwischenspeichert, wird das Produkt möglicherweise nicht erneut hinzugefügt. Das ist wahrscheinlich nicht das, was du willst.

gesagt hat, dass die Standardeinstellung kann entweder durch Verwendung von session_cache_limiter()vorsession_start() oder Setzen der entsprechenden session.cache_limiter Konfigurationseinstellung geändert werden.