2010-08-12 20 views
6

im problem z ustawieniem Etag na niezawodnej przeglądarce użytkownika. Kiedy użytkownik klika jeden z moich zewnętrznych linków, chciałbym ustawić id artykułu na ich Etag (ja też używam ciasteczek, ale idę eksperymentować z Etag specjalnie, aby sprawdzić jego niezawodność).Ustawienie PHP Etag niezawodnie

Kiedy ten sam użytkownik powraca do mojej witryny kilka godzin/dni później, chciałbym móc odczytać wartość Etag i użyć jej do rzeczy.

Potrafię ustawić Etag na pierwszym kliknięciu, ale gdy użytkownik zwróci wartość Etag, zniknie. Zakładam, że wygasł lub coś takiego. Oto kod mam stara:

<? 

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

?> 

Odpowiedz

5

Powinieneś owijając swoje ETAG w cudzysłów (jako link Codler wspomniano pokazy):

'"' . $etag . '"' 

Nie sądzę, że to rozwiąże problem, ale prawdopodobnie trzeba będzie uzyskać

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

zamiast

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

W PHP 5.4 istnieje lepszy sposób to zrobić z http_response_code:

http_response_code(304); 

Również masz sprawdzone Podejrzani przystankach nagłówki? Znaczniki Byte-Order z Unicode są bardzo denerwujące. (Zignoruj, jeśli widzisz inne nagłówki, które ustawiasz)

+0

niesamowite rzeczy !! "" tego właśnie mi brakowało :-) Dzięki! –

+0

Faktycznie, składnia 'header ('Not Modified', true, 304);' spowodowała błąd "500 Internal Server" w mojej sieci Wordpress. Oryginalna składnia wydaje się bezpieczniejsza. – Sphinxxx

+1

@Sphinxxx Niestety, to będzie źle dla większości agentów internetowych, które używają HTTP/1.1 (dlatego zaleciłem go przed twardym kodowaniem). Zaktualizowałem post, dodając funkcję "new" w PHP 5.4, która jest lepsza od innych. Spróbuj zamiast tego. –

-3

wytycznych nie jest tak niezawodny http://developer.yahoo.com/performance/rules.html#etags

+0

Interesujący link, dziękuję - chociaż używamy tylko jednego serwera WWW, więc mam nadzieję, że będzie to przyzwoity plan awaryjny –

+3

Jest to prawdą tylko wtedy, gdy ETag są generowane w pewien sposób . "Problem z ETag polega na tym, że * zwykle * są konstruowane przy użyciu atrybutów, które czynią je unikalnymi dla konkretnego serwera hostującego witrynę". @PeterSmith określa własne ETagi i może łatwo tego uniknąć. –

+6

@Codler, etaty są niezawodne, gdy używasz ich poprawnie i są niewiarygodne, jeśli użyłeś ich nieprawidłowo. – Pacerier

Powiązane problemy