PHP Setting Etag надежно
Вопрос
У меня проблемы надежно установить Etag в браузере пользователя. Когда пользователь нажимает на одну из моих внешних ссылок, я хотел бы установить идентификатор статьи в их ETAG (я тоже использую файлы cookie, но 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);
?>
Решение
Вы должны упаковать свой Etag в двойных кадинатах (поскольку указанный показатель Codler Link):
'"' . $etag . '"'
Я не думаю, что это может решить вашу проблему, но вы, вероятно, хотите
header('Not Modified',true,304);
вместо
header('HTTP/1.0 304 Not Modified');
С PHP 5.4 есть лучший способ сделать это с http_response_code
:
http_response_code(304);
Также вы проверили для обычных подозреваемых запорных заголовков? Маркеры по байту Unicode очень раздражают с этим. (Не обращайте внимания, если вы можете увидеть другие заголовки, которые вы настраиваете)
Другие советы
Etag не так надеженhttp://developer.yahoo.com/performance/rules.html#etags.