Je veux purger des éléments de mon vernis à l'aide de HTTP. Cet appel http est déclenché à partir d'un serveur principal situé derrière le vernis lui-même. Le serveur principal n'a donc pas d'autre accès que HTTP.
J'ai mis en œuvre les règles de purge suivantes avec l'ACL correspondante qui fonctionne bien pour
curl -X PURGE http://www.example.com/image/123/photo-100-150.jpg
mais je veux pouvoir purger une URL via HTTP en utilisant Regex
curl -X PURGE http://www.example.com/image/123/*.jpg
De cette façon, je veux effacer toutes les versions mises à l'échelle de cette image une fois qu'une nouvelle a été téléchargée. Y a-t-il un moyen?
essaye ça:
si vernis 3.0 et plus.
vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~purge){
error 405 "Not allowed";
}
ban("req.http.Host == " +req.http.Host+" && req.url ~ "+req.url);
error 200 "Ban added";
}
Définissez d’abord une liste blanche des personnes pouvant utiliser la purge, puis ajoutez la strophe purger dans votre VCL.
acl purge {
"127.0.0.1";
"10.22.0.0"/16;
}
sub vcl_recv {
if (req.http.X-Purge-Regex) {
if (!client.ip ~ purge) {
error 405 "Varnish says nope, not allowed.";
}
ban_url(req.http.X-Purge-Regex);
error 200 "The URL has been Banned.";
}
Varnish utilisera la valeur de l'en-tête X-Purge-Regex
pour créer une interdiction.
Alors vous pouvez interdire des choses comme celle-ci:
curl -v -X PURGE -H 'X-Purge-Regex: ^/assets/*.css' varnishserver:6081
ou
curl -v -X PURGE -H 'X-Purge-Regex: ^/images/*' varnishserver:6081
varnishserver
est l'adresse de votre serveur de vernis.
acl purge {
"127.0.0.1";
}
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "IP:" + client.ip + " Not allowed.";
}
ban("req.http.Host == " + req.http.Host + " && req.url ~ " + req.url);
error 200 "Host:" + req.http.Host + " url:" + req.url + " Ban added";
}
}
Bien sûr il y a.
En VCL, vous souhaitez utiliser la méthode d'interdiction - décrite dans "man vcl". Il crée un filtre sur les demandes entrantes. Si vous comptez l'utiliser à un rythme de plus de 2 fois par seconde, je vous recommande de rechercher Google "ban luker friendly" et de réécrire les expressions en conséquence.
Code non testé:
sub vcl_recv {
if (req.method == "PURGERE" and client.ip ~ admin_network) {
ban("req.http.Host == " + req.http.Host + " && req.url == " + req.url);
}