2017-09-03 9 views
0

Sur une configuration de site Web multiple utilisant le vernis 5.1 sur le port 80, je ne veux pas mettre en cache tous les domaines. Cela se fait facilement dans vcl_recv.Varnish vcl_backend_response detect vcl_recv return (hash)

if (req.http.Host == "cache.this.domain.com") { 
    return(hash); 
} 

return(pass); 

Maintenant, dans vcl_backend_response, je veux effectuer un traitement pour les domaines mis en cache.

Bien sûr, je peux faire si (bereq.http.Host == "cache.this.domain.com"), mais est-il un moyen de savoir si c'était un retour (hachage) ou un retour (passer) appelez vcl_recv depuis vcl_backend_response? Je pensais que cela pourrait avoir du sens, mais n'a pas pu trouver l'information.

Merci pour votre aide.

Répondre

0

Je me demande vraiment pourquoi vous avez besoin d'un tel traitement en premier lieu.

Je ne pense pas qu'il existe un moyen de dire directement comment vous avez atterri dans vcl_backend_response. Donc je suppose que vous pouvez définir un drapeau et vérifier plus tard, à savoir:

sub vcl_recv { 
    if (req.http.Host == "cache.this.domain.com") { 
     set req.http.return_type = "hash"; 
     return(hash); 
    } 
    set req.http.return_type = "pass"; 
    return(pass); 
} 

sub vcl_backend_response { 
    if(bereq.http.return_type == "pass") ... 
} 
+0

Je vais accepter votre réponse. J'espérais qu'il y aurait une façon plus élégante. Je voulais mettre en cache dans vcl_backend_response erreurs de backend, et seulement pour ceux qui ont entré par hachage pour redémarrer la requête en l'accrochant à un fail_be permanent pour essayer et pêcher à partir du cache. Merci. –

1

En plus de l'approche ad hoc proposée par V. @ Daniel, une alternative qui pourrait répondre à vos besoins est:

sub vcl_backend_response { 
    if (!bereq.uncacheable) { 
     ... 
    } 
} 

Ceci vous permet d'exécuter le traitement supplémentaire uniquement pour les objets pouvant être mis en cache.

+0

Pas sûr de son caractère inaccessible est à faire avec hit pour passer –

+1

'bereq.uncacheable' sera défini sur' true' (c'est une variable en lecture seule) sur les passes du côté client ou lors de la frappe sur un objet HFP. Comme je l'ai dit, cela pourrait être ou non dans votre cas d'utilisation en fonction de vos besoins spécifiques. –

+0

Je vais essayer et vous le faire savoir. Merci. J'espère juste que ceci n'est pas réglé sur true si une requête précédente renvoyait un 503 (le backend se conduisant mal en crachant quelques réponses vides pendant quelques secondes et le redémarrage arrive trop tôt pour que le backend change d'avis) –