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