我使用 smarty 作为我的模板引擎,YSlow(Firefox 插件)报告我的 Etag 标志是“F”但我使用 smarty。我如何将 Etag 与 smarty 一起使用,而我的主要 tpl 是 framework.tpl 和分配给它的所有其他模板
3 回答
如果您决定在您的页面上确实需要ETag(这与实现它们只是为了通过一些随意的测试不同),我对这个(旧)脚本有很好的经验:http: //simonwillison.net/2003/ Apr/23/有条件获取/
请注意,这并不是 Smarty 特定的,因为 Smarty 处理页面模板;这整个“条件请求”业务(使用 ETag 和 Last-Modified 等等)发生在 HTTP标头中,所以上面的代码只是普通的 PHP。
您需要确定资源的最后修改时间(这可能与文件修改不同 - 例如,数据库的相关部分最后一次更改是什么时候?),并将其传递给doConditionalGet($timestamp)
; 然后它将发送 304 并终止,或返回给您(这意味着您需要进行整页处理,就好像没有任何条件请求一样)。
只是指令
FileETag None
在您的 .htaccess 文件中禁用 ETag 标头字段。YSlow 将不再抱怨...... :)
您可以在 Smarty中使用输出过滤器。下面是一些用于ETag的现成代码:
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 结合使用。