Jan 212015
 

Sur varnish 3, il fallait ajouter du code c pour ajouter le header Expires correspondant au max-age du Cache-Control :
Varnish : transformer le Cache-Control : max-age en Expires

Maintenant une ligne suffit :
Dans le vcl_backend_response :

if (beresp.http.cache-control ~ "max-age=" ) {
        set beresp.http.Expires = "" + (now + std.duration(regsub(beresp.http.cache-control,"max-age=([0-9]+).*$","\1")+"s", 0s));
}

ou dans le vcl_deliver :

if (resp.http.cache-control ~ "max-age=" ) {
        set resp.http.Expires = "" + (now + std.duration(regsub(resp.http.cache-control,"max-age=([0-9]+).*$","\1")+"s", 0s));
}
Fév 072013
 

L’ESI (Edge Side Includes) est supporté par Varnish. C’est un language de balisage HTML permettant d’assembler une page dynamique.
Cela permet de cacher avec différents temps en cache ou de ne pas cacher, différents bloc d’une page.
Par exemple :
ESI
On peut définir le temps de cache avec le header « Cache-Control : max-age » ou directement dans la configuration varnish.
Voici une page d’exemple :
– index.php :

<?php
        header('Cache-Control: max-age=3600');
?>
<title>Page de test ESI</title>
<html><body>
        Cette page est cach&eacute;e pourtant j'arrive &agrave; afficher l'heure :
        <esi:include src="/dyn/date.php"/>
</body></html>

– date.php :

<?php
        header('Cache-Control: max-age=0');
        echo date('Y-m-d H:i:s');
?>

Il faut activer l’ESI dans la configuration varnish :

sub vcl_fetch {
        set beresp.do_esi = true;

Si vous avez un panier, il faut pouvoir identifier les utilisateurs avec une session php.
Si il y a une session php, elle ne peut pas être définit par la page cachée : il faudra donc la générer autrement :

<script type='text/javascript' src="/dyn/sessions.php"></script>

– sessions.php :

<?php
        session_start();
?>

Pour que tous les utilisateurs reçoivent la page commune cachée et qu’elle reste dynamique en fonction des utilisateurs il faut enlever la session des cookies pour les pages/parties communes et la laisser pour les pages/parties individuelles.
Dans la configuration varnish :

if ( ! req.url ~ "^/dyn" ) {
        set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");
        if (req.http.Cookie ~ "^$") {
            unset req.http.Cookie;
        }

On peut tester avec cette page :
– index.php :

<?php
        header('Cache-Control: max-age=3600');
?>
<title>Page de test ESI</title>
<html><body>
        Cette page est cach&eacute;e pourtant j'arrive &agrave; afficher l'heure :
        <esi:include src="/dyn/date.php"/>
        <br>Ainsi que l'ID de session : <esi:include src="/dyn/phpsess.php"/>
        <script type='text/javascript' src="/dyn/sessions.php"></script>
</body></html>

– phpsess.php :

<?php
        header('Cache-Control: max-age=0');
        echo $_COOKIE["PHPSESSID"];
?>

Le résultat : http://blog.jeremm.fr/esi/
A la première visite vous n’avez pas de session, elle ne sera donc pas affichée.

Sep 302012
 

Création de l’Expires à partir du cache-control max-age si il est présent et différent de 0, puis suppression du max-age.

Ajoutez au début de la configuration :

C{
        #include <string.h>
        #include <stdlib.h>
 
        void TIM_format(double t, char *p);
        double TIM_real(void);
}C

Et dans le vcl_deliver :

if ( resp.http.Cache-Control ~ "max-age" && ! resp.http.Cache-Control ~ "max-age=0" ) {
        C{
                 char *cache = VRT_GetHdr(sp, HDR_RESP, "\016cache-control:");
                 char date[40];
                 int max_age = -1;
                 int want_equals = 0;
                 if(cache) {
                         while(*cache != '\0') {
                                 if (want_equals && *cache == '=') {
                                         cache++;
                                         max_age = strtoul(cache, 0, 0);
                                         break;
                                  }
                                  if (*cache == 'm' && !memcmp(cache, "max-age", 7)) {
                                         cache += 7;
                                         want_equals = 1;
                                         continue;
                                  }
                         cache++;
                         }
                         if (max_age != -1) {
                                 TIM_format(TIM_real() + max_age, date);
                                 VRT_SetHdr(sp, HDR_RESP, "\010Expires:", date, vrt_magic_string_end);
                         }
                 }
        }C
        set resp.http.Cache-Control = regsuball(resp.http.Cache-Control,"max-age=[0-9]+(,)?", "");
        if ( resp.http.Cache-Control ~ "^$") {
                 unset resp.http.Cache-Control;
        }
}

Source : https://www.varnish-cache.org/trac/wiki/VCLExampleSetExpires