2009-10-18 10 views
13

Ich verwende ein PHP-Skript, um Dateien zu liefern. Ich würde gerne eine 304 nicht geänderten Header in meiner HTTP-Antwort senden, wenn die Datei seit dem letzten Download des Clients nicht geändert hat. Dies scheint ein Feature in Apache (und den meisten anderen Webservern) zu sein, aber ich habe keine Ahnung, wie dies durch PHP implementiert werden kann.304: Nicht geändert und Front-End-Caching

Ich habe von der Verwendung von $_SERVER['HTTP_IF_MODIFIED_SINCE'] gehört, aber diese Variable scheint nicht in meinem $_SERVER Super-Array erscheinen.

Meine Frage ist nicht, wie man einen 304 Header zurückgibt, aber wie man weiß, dass man zurückgegeben werden sollte.


Edit: Das Problem ist, dass mein $_SERVER['HTTP_IF_MODIFIED_SINCE'] nicht gesetzt ist. Dies ist der Inhalt meiner .htaccess Datei:

ExpiresActive On 
ExpiresByType image/jpeg "modification plus 1 month" 
ExpiresByType image/png "modification plus 1 month" 
ExpiresByType image/gif "modification plus 1 month" 
Header append Cache-Control: "must-revalidate" 


<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond $1 !^(controller\.php) 
    RewriteRule (.*\.jpg|.*\.png|.*\.gif) controller.php/$1 
</IfModule> 

HTTP_IF_MODIFIED_SINCE noch nicht in dem $_SERVER Super-Array angezeigt wird.

Antwort

26

HTTP_IF_MODIFIED_SINCE ist der richtige Weg, es zu tun. Wenn Sie es nicht erhalten, überprüfen Sie, ob Apache mod_expires und mod_headers aktiviert hat und ordnungsgemäß funktioniert. Entlehnt a comment on PHP.net:

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 
// always send headers 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 
// exit if not modified 
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 

// output data 
+1

Ich habe diese Art gesehen, dies zu tun, aber $ _SERVER ['HTTP_IF_MODIFIED_SINCE'] ist immer leer für mich ... –

+0

Überprüfen Sie meine letzten Bearbeitung - Ich habe ein Stück wichtige Apache Config Info. –

+0

Versucht, meine htaccess.txt-Datei wie unter http://www.webmasterworld.com/forum23/2300.htm zu ändern, aber nicht gehen. Irgendwelche Ideen? –

0

$_SERVER['HTTP_IF_MODIFIED_SINCE'] ist in der Regel leer, wenn register_globals ausgeschaltet ist.

Überprüfen Sie, ob das der Fall ist, und wenn ja versuchen getenv('HTTP_IF_MODIFIED_SINCE')

1

This article werden alle Ihre Fragen über Caching beantworten

fand ich, dass das Hinzufügen

RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}] 
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}] 

Zum Ende meiner .htaccess-Datei (unter allen rewriterule) gearbeitet.

0

Es gibt auch einige andere Parameter zu überprüfen .. in meinem Fall habe ich nicht diese beiden Header hatte:

$_SERVER['HTTP_IF_NONE_MATCH'] && $_SERVER['HTTP_IF_MODIFIED_SINCE'] 

, die eine richtige 304-Header zurück erforderlich, wie mein System Uhr war ein Ende wenig, es würde diese Seiten als auslaufende in der Zukunft interpretieren, dann nicht, diese Werte in allen

Senden sie auch, dass Header überprüfen, die von apache oder zumindest außer Kraft setzt sie auf einen größeren Wert

Cache-Control: max-age=3600 
zurückgegeben

Da es nicht vorherigen Header wenn

Last-Modified previous sent header < (NOW - 3600) 

Also in meinem Fall senden werde ich diese ziemlich praktische Funktion function lastModified($file){ $x=filemtime($file); while($x>time())$x-=86000;}#reduce by one day if touched in future date $date=gmdate('D, j M Y H:i:s',$x).' GMT'; header('Cache-Control: max-age=86000',1); if($_SERVER['HTTP_IF_NONE_MATCH'] == $x || $_SERVER['HTTP_IF_MODIFIED_SINCE']==$date){ header('HTTP/1.1 304 Not Modified',1,304);die;} header('Etag: '.$x,1);header('Last-Modified: '.$date,1); }

0

Ich hatte dieses Problem und es stellte sich heraus, um einfach festgelegt haben, dass ich hatte Firebug offen. Dies hat eine Option unter der Registerkarte Net "Browser-Cache deaktivieren", die standardmäßig aktiviert ist. Es gibt eine ähnliche Option in den Chrome-Entwicklertools, eines der Kontrollkästchen in der Leiste unter der Menüleiste.

Das Aufheben dieser Optionen hat dazu geführt, dass der Browser HTTP_IF_MODIFIED_SINCE korrekt gesendet hat und alles funktioniert (auch wenn Firebug oder Chrome Dev Tools geöffnet sind).

Verwandte Themen