2017-02-24 2 views
0

Juste nouveau pour Vernis. . Il devient difficile, plus que prévu :-(Mise en cache de vernis avec des biscuits

J'essaie d'améliorer un peu de code php, développé il y a quelque temps, en utilisant le vernis Ce code utilise seulement deux cookies: PHPSESSID et LANGUE

Toutes les pages définies . cookies PHPSESSID si ce n'est pas défini mais ce cookie pour les sessions anonymes, il est utilisé dans une page

Disons que je Page1, Page2, Page3 et Page4 Ma configuration doit être la suivante:..

Page1, Page2 et Page3 ont besoin de cookie LANGUAGE et devraient être mis en cache avec ce cookie: un cache fo r chaque langue et page.

Page4 nécessite des cookies PHPSESSID et LANGUAGE, et ne doit pas être mis en cache car il est spécifique à chaque utilisateur.

Mon fichier default.vlc ne fonctionne pas correctement, donc toute orientation serait vraiment appréciée. Peut-être que j'ai mal compris certains concepts.

sub vcl_init { 

    # When requests come to Varnish I need to remove PHPSESSID so it's not used for the hash in caching. Page4 doesn't need caching as it's specific for each user: 
     if (req.http.host ~ "Page4") { 
     return(pass); 
     } 

    # remove PHPSESSID so pages1, 2, and 3 get cached just once for everyuser but in all languages. 

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

    return (hash); 


    } 

J'ai besoin de mettre en cache des pages Web avec cookie LANGUE donc je l'inclure dans vcl_hash:

sub vcl_hash { 
    hash_data(req.url); 
    if (req.http.host) { 
    hash_data(req.http.host); 
    } else { 
    hash_data(server.ip); 
    } 

    # hash cookies for requests that have them 
    if (req.http.Cookie) { 
    hash_data(req.http.Cookie); 
    } 
} 

Comment puis-je supprimer tout PHPSESSIONID?

sub vcl_backend_response { 
    # Called after the response headers has been successfully retrieved from the backend. 

    if (!(bereq.url ~ "Page4")) { 
    unset beresp.http.set-cookie; 
    } 
    return (deliver); 

} 

Répondre

1

Vous êtes sur la bonne voie. Si je comprends votre question, la chose qui ne fonctionne pas est que vous supprimez tous les cookies réponse du serveur (si ce n'est pas Page4) au lieu de simplement supprimer PHPSESSID.

Vous pouvez faire une expression rationnelle dans votre sub vcl_backend_response pour supprimer seulement phpsessionid si l'URL n'est pas Page4.

beresp.http.set-cookie = regsuball(beresp.http.set-cookie, "PHPSESSID=[^;]+(;)?", "") 

Sinon, si vous utilisez un vernis 4 ou au-dessus, vous devez utiliser le cookie de VMOD qui rend la manipulation plus facile cookies (plus besoin de regexp).