我怎么能在聪明中使用ETag?

时间:2011-05-12 07:59:29

标签: php smarty etag

我使用smarty作为我的模板引擎,YSlow(Firefox插件)报告我,我的Etag标志是“F”但我使用smarty。 我怎么可以聪明地使用Etag,我的主要tpl是framework.tpl和所有其他模板分配给它

3 个答案:

答案 0 :(得分:1)

如果你确定你的页面上实际上需要 ETag(这与实现它们不同只是为了通过一个有点武断的测试),我对这个(较旧的)脚本有很好的经验: http://simonwillison.net/2003/Apr/23/conditionalGet/

请注意,这不是Smarty特有的,因为Smarty处理页面模板;整个“条件请求”业务(使用ETag和Last-Modified等等)发生在HTTP headers 中,因此上面的代码只是普通的PHP。

您需要确定资源的最后修改时间(可能与文件修改不同 - 例如,最后一次数据库的相关部分何时更改?),并将其传递给doConditionalGet($timestamp);然后它会发送一个304并终止,或者返回给你(这意味着你需要进行整页处理,好像没有任何条件请求)。

答案 1 :(得分:0)

仅仅是指令

FileETag None
<。>在.htaccess文件中禁用ETag标头字段。 YSlow将不再抱怨......:)

答案 2 :(得分:0)

您可以在Smarty中使用output filter。下面是 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结合使用。