1

テンプレート エンジンとして smarty を使用すると、YSlow (Firefox アドオン) から Etag フラグが「F」であると報告されますが、smarty を使用しています。smarty で Etag を使用するにはどうすればよいですか。メインの tpl は Framework.tpl で、他のすべてのテンプレートがそれに割り当てられます

4

3 に答える 3

1

ページに ETag が実際に必要であると判断した場合(これは、やや恣意的なテストに合格するためだけに ETag を実装するのとは異なります)、私はこの (古い) スクリプトで良い経験をしました: http://simonwillison.net/2003/ 04/23/条件付Get/

Smarty はページ テンプレートを扱うため、これは Smarty 固有のものではないことに注意してください。この「条件付きリクエスト」ビジネス全体 (ETag や Last-Modified などを使用) は HTTPヘッダーで発生するため、上記のコードは単純な PHP です。

リソースの最終変更時刻 (ファイルの変更とは異なる場合があります。たとえば、データベースの関連部分が最後に変更されたのはいつですか?) を特定し、それを に渡す必要がdoConditionalGet($timestamp)あります。その後、304 を送信して終了するか、返されます (つまり、条件付きの要求がなかったかのように、ページ全体の処理を行う必要があります)。

于 2011-05-12T08:17:17.507 に答える
0

単にディレクティブ

FileETag None

.htaccess ファイルで ETag ヘッダー フィールドを無効にします。YSlow はもう文句を言いません... :)

于 2011-05-12T08:12:36.380 に答える
0

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 と組み合わせることができます。

于 2016-06-10T17:55:31.297 に答える