2010-08-12 13 views
6

Ich habe Probleme beim Einstellen der Etag im Browser eines Benutzers zuverlässig. Wenn ein Benutzer auf einen meiner externen Links klickt, möchte ich die Artikel-ID in sein Etag setzen (ich verwende auch Cookies, aber ich möchte mit Etag experimentieren, um seine Zuverlässigkeit zu testen).PHP-Einstellung Etag zuverlässig

Wenn derselbe Benutzer ein paar Stunden/Tage später auf meine Website zurückkehrt, würde ich gerne den Etag-Wert lesen und für etwas verwenden können.

Ich kann ein Etag auf den ersten Klick setzen, aber wenn der Benutzer zurückkehrt, ist der Etag-Wert weg. Ich nehme an, es ist abgelaufen oder so. Hier ist der Code, den ich versucht haben:

<? 

$time = 1280951171; 
$lastmod = gmdate('D, d M Y H:i:s \G\M\T', $time); 
$etag = '123'; 


$ifmod = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod : null; 
$iftag = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] == $etag : null; 

if (($ifmod || $iftag) && ($ifmod !== false && $iftag !== false)) { 
    header('HTTP/1.0 304 Not Modified'); 
} else { 
    header("Last-Modified: $lastmod"); 
    header("ETag: $etag"); 
} 

print_r($_SERVER); 

?> 

Antwort

5

Sie sollten Ihre etag in doppelte Anführungszeichen werden Verpackung (als Link Codler Shows erwähnt):

'"' . $etag . '"' 

ich glaube nicht, ist es wahrscheinlich, Ihr Problem zu lösen, aber Sie wollen wahrscheinlich

header('Not Modified',true,304); 

statt

header('HTTP/1.0 304 Not Modified'); 

Ab PHP 5.4 gibt es einen besseren Weg, dies mit http_response_code zu tun:

http_response_code(304); 

Außerdem haben Sie die üblichen Verdächtigen kontrolliert stoppen Header? Unicode-Byte-Order-Marker sind dabei sehr nervig. (Achtung, wenn Sie andere Header sehen können, die Sie selbst einstellen)

+0

tolle Sachen !! das "" ist was ich vermisst habe :-) Danke! –

+0

Tatsächlich führte die 'header ('Not Modified', true, 304);' -Syntax zu einem "500 Internal Server Error" in meinem Wordpress-Web. Die ursprüngliche Syntax scheint sicherer zu sein. – Sphinxxx

+1

@Sphinxxx Leider wird das für die meisten Web-User-Agenten, die HTTP/1.1 verwenden, falsch sein (weshalb ich empfahl, sie nicht hart zu codieren). Ich habe den Beitrag aktualisiert, um eine "neue" Funktion in PHP 5.4 zu integrieren, die den anderen vorzuziehen ist. Probieren Sie das stattdessen. –

-3
+0

Interessanter Link, danke - obwohl wir nur einen Webserver verwenden, so sollte es hoffentlich ein anständiger Fallback-Plan sein –

+3

Das ist nur wahr, wenn ETags auf bestimmte Arten generiert werden . "Das Problem mit ETags ist, dass sie * typischerweise * mit Attributen erstellt werden, die sie für einen bestimmten Server, der eine Site hostet, einzigartig machen." @PeterSmith gibt seine eigenen ETags an und kann dies leicht vermeiden. –

+6

@Codler, Etags sind zuverlässig, wenn Sie sie richtig verwenden, und unzuverlässig, wenn Sie sie falsch verwendet haben. – Pacerier