2010-06-15 12 views
28

Ich habe eine Website, die Wartung ich geerbt haben, die ein großes haariges Chaos.
Eines der Dinge, die ich mache, ist die Leistung verbessert. Unter anderem füge ich Bilder zu Expires hinzu.Was könnte das Hinzufügen „Pragma: no-cache“ auf meine Antwort-Header? (Apache, PHP)

Jetzt gibt es einige Bilder, die durch eine PHP-Datei bedient werden, und ich bemerke, dass sie den Expires Header haben, aber sie werden auch jedes Mal geladen.

auf Antwortheader Sehen, sehe ich:

Expires Wed, 15 Jun 2011 18:11:55 GMT 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma no-cache 

die offensichtlich das Problem erklärt.

Jetzt habe ich überall auf der Codebasis geschaut, und es sagt nirgends "Pragma". .htaccess scheint auch nichts zu haben.

Irgendwelche Ideen, was diese "Pragma" (und "Cache-Kontrolle") Header setzen könnte, und wie kann ich es vermeiden?

Antwort

9

Erstellen Sie eine einfache Datei, die keine Ihrer PHP-Bibliotheken enthält, sich aber im selben Ordner befindet wie die Datei, die Ihre Bilder über eine PHP-Datei bereitstellt.

file: test.php 

Diese Datei über einen Browser anfordern und die Kopfzeilen überprüfen. Wenn Sie die Antwort-Header zu sehen, dass Sie nicht wollen, wissen Sie, dass sie über Apache konfiguriert sind und nicht über eine PHP-Datei generiert und Sie können Ihre Suche auf .htaccess-Datei im Verzeichnisbaum und auf der http.confg konzentrieren und andere enthalten Apache Config-Dateien. Sie werden für

<Directory.... 

und

<VirtualHost 

Abschnitte suchen möchten, die auf Ihre Website gelten.

Wenn Sie die Header in einer Anfrage für diese einfache PHP-Datei nicht sehen, wissen Sie, dass PHP die Header irgendwo setzt. Am Ende Ihres Bildes dient Datei (oder direkt nach dem Echos das Bild und Ausfahrten), aber die folgende PHP-Schnipsel)

var_dump(get_included_files()); 

Anfrage ein Bild durch das Bild dient URL. Das obige Snippet druckt alle PHP-Dateien aus, die in der Anfrage verwendet werden. (Sie werden wahrscheinlich Quelle anzuzeigen benötigen oder verwenden curl die Rohausgangssignal zu sehen, wie der Browser ein ungültiges Bild berichten)

einen Teil Ihrer Dateien Mit Datei zu arbeiten, für Anrufe an die

durch sie suchen
header(); 

Funktion. Die header Funktion ist die einzige Art und Weise (glaube ich), dass Roh-Code PHP-Response-Headern festlegen.Sie werden auch für

call_user_func 
eval 
$$ 

bei suchen möchten es irgendeine dynamische Code auf der Seite, die PHP-Meta-Programmierung Fähigkeiten rufen Sie die header Funktion verwenden.

Viel Glück!

+0

Wow, danke für die ausführliche Antwort. Es ist definitiv Apaches Konfiguration, aber ich habe keinen Zugriff darauf. Ich habe nur FTP-Zugang zum Verzeichnis meiner Website. Irgendeine Idee, wie ich diese Überschriften nur mit meinen .htaccess Akten überschreiben/entfernen kann? –

+0

Leider ist das zu allgemein, um schnell eine Antwort zu finden. Sie müssen wissen, welche Apache-Direktiven das Zwischenspeichern verursachen, um die Effekte zu überschreiben, und müssen wissen, ob sie in .htaccess überschrieben werden UND die dafür erforderliche Syntax kennen. Anstatt zu viel Zeit zu verschwenden, würde ich die Kette an die Serveradministratoren richten und sehen, ob sie Ihnen nicht helfen können, da "Caching standardmäßig" nicht die Standardkonfiguration von Apache und/oder dem PHP-Modul ist. #nothelpfulsorry –

+0

Vielen Dank. –

1

Wenn es nicht in .htaccess ist, kann es in der Haupt-Apache-Konfigurationsdatei sein - oder in einem der Includes, abhängig von der Konfiguration.

+0

Irgendwelche Ideen, wie Sie es von meinem .htaccess überschreiben? (Ich habe keinen SSH-Zugang zu diesem Server oder Zugang zu httpd.conf) –

+0

Nicht sicher, wie man * einen Header tatsächlich * entfernt - versuchen Sie, auf serverfault zu fragen. –

-1

Führen Sie grep -R pragma . aus, um durch die Dateien zu suchen.

+1

Hat das gemacht. Nichts. Das meinte ich mit "Ich habe die ganze Codebasis durchsucht" –

6

Versuchen Sie, die Header in .htaccess zu deaktivieren. Das folgende Beispiel wird sie für alle Dateien unset die Erweiterungen passende ico, jpeg, png, gif, js, css:

<FilesMatch "\.(ico|jpeg|png|gif|js|css)$"> 
    Header unset Cache-Control 
    Header unset Pragma 
</FilesMatch> 

Sie einige Hinweise in this article finden.

27

Der Schuldige kann php.ini sein, wo session.cache_limiter = nocache. Ändern Sie den Wert in leer oder öffentlich, um die Anti-Cache-Header zu vermeiden.

+0

Danke! Ich habe den Standardwert von session.cache_limiter ('nocache') in '' geändert und das Problem wurde behoben. – Yeroon

+0

"Öffentlich", wäre das nicht gefährlich für eine Website mit privaten Seiten? –

+0

Vermutlich beschränkt dies das Caching nur auf öffentliche Dokumente. – technomage

3

Ich tat dies zur Laufzeit mit diesem:

header("Pragma:"); 

, die das Skript die Pragma-Header unscharf zu schalten gezwungen.

+0

Es ist funktioniert, ich kann sehen, dass Pragma übersteuert wurde. –

10

Ich hatte ein ähnliches Problem mit Pragma: nocache

session_cache_limiter(false); vor session_start(); schien es zu unterdrücken.

+0

Siehe: http://php.net/manual/en/function.session-start.php – Almer

0

Es ist erwähnenswert für Leute mit ähnlichen Problemen, dass viele Frameworks Header automatisch hinzufügen, vor allem Caching. Es ist ziemlich einfach, sie entweder in der Framework-Bibliothek oder in Ihrer App zu überladen.

+0

Ein Grund für den Downvote? Ich weiß, dass Zend automatisch Header hinzufügt. Die Header können über das Header-Tag von php überladen werden, wie von Michael gezeigt, oder das Framework hat seine spezielle Funktion, dies zu tun. Für Zend musst du setHeader() benutzen – twunde