PHP настраивает Etag надежно - PullRequest
6 голосов
/ 12 августа 2010

У меня проблемы с надежной установкой Etag в браузере пользователя.Когда пользователь нажимает на одну из моих внешних ссылок, я хотел бы установить идентификатор статьи в свой Etag (я тоже использую куки, но id хотел бы поэкспериментировать с Etag специально для проверки его надежности).

Когда тот же пользователь вернется на мой сайт через несколько часов / дней, я хотел бы иметь возможность прочитать значение Etag и использовать его для разных целей.

Я могу установить Etag при первом щелчке, но когда пользователь вернет значение Etag, оно исчезнет.Я предполагаю, что его истек или что-то.Вот код, который я пытался:

<?

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

?>

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

Вы должны заключить свой etag в двойные кавычки (как показывает ссылка, упомянутая Кодлером):

'"' . $etag . '"'

Я не думаю, что это может решить вашу проблему, но вы, вероятно, хотите

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

вместо

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

Начиная с PHP 5.4, есть лучший способ сделать это с http_response_code:

http_response_code(304);

Также естьВы проверили, как обычно подозреваемые останавливают заголовки?Маркеры порядка следования байтов Unicode очень раздражают.(Не обращайте внимания, если вы видите другие заголовки, которые вы устанавливаете сами)

0 голосов
/ 12 августа 2010

Этаг не так надежен http://developer.yahoo.com/performance/rules.html#etags

...