Как я могу использовать ETag в Smarty? - PullRequest
1 голос
/ 12 мая 2011

Я использую smarty в качестве механизма шаблонов, а YSlow (аддон Firefox) сообщает мне, что мой флаг Etag - "F", но я использую smarty. Как я могу использовать Etag с Smarty и мой основной TPL является framework.tpl и все другие шаблоны, назначенные ему

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Если вы решите, что вам действительно нужно ETag на ваших страницах (что отличается от их реализации просто для прохождения несколько произвольного теста), у меня будет хороший опыт работы с этим (более старым) сценарием: http://simonwillison.net/2003/Apr/23/conditionalGet/

Обратите внимание, что это на самом деле не относится к Smarty, так как Smarty имеет дело с шаблонами страниц; весь этот бизнес «условного запроса» (с ETag и Last-Modified и прочее) происходит в HTTP заголовках , поэтому приведенный выше код просто PHP.

Вам необходимо определить время последнего изменения вашего ресурса (которое может отличаться от изменения файла - например, когда в последний раз изменялась соответствующая часть базы данных?) И передать его в doConditionalGet($timestamp); затем он либо отправит 304 и прекратит работу, либо вернет вас назад (что означает, что вам нужно выполнить полную обработку страницы, как если бы не было условного запроса).

0 голосов
/ 10 июня 2016

Вы можете использовать выходной фильтр в Smarty. Ниже приведен готовый код для ETag ging:

function etag_handler($output)
{
    $etag = md5($output);
    header('ETag: '.$etag);
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) !== FALSE)
    {
        header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
        return '';
    }
    return $output;
}

$smarty->registerFilter('output', 'etag_handler');

Поместите это где-нибудь до $smarty->display(...);.

Обратите внимание, что с этим кодом сервер по-прежнему вычисляет вывод, но если у клиента уже есть идентичный ответ, сервер не будет отправлять его снова, так что это просто экономит сетевой трафик. Если вы хотите сэкономить вычислительную мощность на сервере, вам нужно заняться чем-то другим (кэширование), но вы можете объединить это с ETagging.

0 голосов
/ 12 мая 2011

Просто, но директива

FileETag None

в вашем файле .htaccess отключить поле заголовка ETag.YSlow больше не будет жаловаться ...:)

...