13

Varnish is being used in a Wordpress website.

I would like to purge Varnish for a single URL instead of a whole domain.

With this command I can restart Varnish for the whole domain:

varnishadm -T :6082 -S /etc/varnish/secret 'ban req.http.host ~ \"http://www.foo.com\" && req.url ~ \"^/\"'

However I would like to purge varnish only for a single url.

Ex: www.foo.com/url_to_be_purged

I've tried the previous command replacing it with the single URL:

varnishadm -T :6082 -S /etc/varnish/secret 'ban req.http.host ~ \"http://www.foo.com/url_to_be_purged\" && req.url ~ \"^/\"'

But it didn't work, the URL still was a HIT in Varnish.

Any ideas of how can I achieve this?

UPDATE

As suggested ghloogh's answer, I've tried the following command:

varnishadm -T :6082 -S /etc/varnish/secret ban "req.http.host == http://www.foo.com && req.url == http://www.foo.com/url_to_be_purged"

I've also tried this variation:

varnishadm -T :6082 -S /etc/varnish/secret ban "req.http.host == http://www.foo.com && req.url == /url_to_be_purged"

But I still get a HIT in the URL and the data is not updated

rfc1484
  • 201
  • 2
  • 3
  • 7
  • 1
    man, stop using scheme (http:// or https:// or ftp:// or other) in hostname :) your command should be: varnishadm -T :6082 -S /etc/varnish/secret ban "req.http.host == www.foo.com && req.url == /url_to_be_purged" – ghloogh Jul 11 '13 at 15:42
  • How can we purge URL by pattern, say all matches for /foo/bar/ab* – anup Jun 11 '21 at 06:58

2 Answers2

20

You don't need to specify scheme for hostname and you may use strict match instead of regex:

varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban "req.http.host == example.com && req.url == /some/url/"
ghloogh
  • 1,049
  • 5
  • 9
  • 1
    The other answer had the quote in the wrong place. > varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret "ban req.url == /url_to_be_purged" – Jim Holmes Oct 21 '16 at 12:00
2

You can try the following:

sudo varnishadm -S /etc/varnish/secret  -T 127.0.0.1:6082 "ban req.url ~ \"http://example.com/testimage.png$\""

worked for me.

Abhishek
  • 21
  • 1
  • 2
    This doesn't add anything but `sudo` to the other answer. This might be better as a comment. – Esa Jokinen Jun 26 '17 at 12:52
  • you saved my day! To solve it is necessary to consider the slashes before the quotes – Alfredo Lanzetta May 12 '20 at 08:44
  • The difference for me was the idea of using the `$` in the regex to ensure no other URLs containing the one to clear gets wiped out. The other answer requires you know the domain to clear. For me I don't know the domain, just the URI fragment so this method works well for me. – Daniel Black Oct 11 '22 at 20:29