Varnish · Edge Side Includes
Une page, cinq durées de cache
Varnish met la page en cache 10 secondes, mais assemble à chaque requête les fragments
<esi:include> qu'elle contient : chacun a sa propre durée de vie, publique ou
par session. Rechargez la page, connectez-vous, et regardez quelles heures changent.
ESI
Fragments
<esi:include src="/menu.php" />
Connecté
ce menu est mis en cache pour votre session seulement
Déconnexion
<esi:include src="/time.php" />
Heure serveur : 27/10/2026 10:39:43, recalculée à chaque requête
/index.php
Contenu public de la page
Ce bloc n'est pas un fragment : il fait partie de la page elle-même, et suit donc son TTL.
<esi:include src="/user.php" />
Dernière connexion il y a 0s
<esi:include src="/sidebar.php" />
Widgets publics
Le même pour tout le monde, régénéré toutes les 20 secondes.
Code
Sous le capot
php/index.php
// Varnish doit interpréter les balises ESI
header('Surrogate-Control: abc=ESI/1.0');
// La page reste 10s en cache
header('X-Reverse-Proxy-TTL: 10');
?>
<esi:include src="/menu.php" />
<esi:include src="/time.php" />
<esi:include src="/user.php" />
<esi:include src="/sidebar.php" />
varnish/default.vcl
sub vcl_backend_response {
if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
set beresp.do_esi = true;
}
if (beresp.http.X-Reverse-Proxy-TTL) {
set beresp.ttl = std.duration(
beresp.http.X-Reverse-Proxy-TTL + "s", 0s);
}
}
# menu.php et user.php : une entrée par session
sub vcl_hash { hash_data(req.http.Cookie); }