Varnish-Cache, VCL: 301 Redirect

A typical 301 redirect is usually configured in your apache vhost file. But you can also use varnish-cache to perform the redirect without passing the request to your backend.

Apache Redirect Example

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} ^(www\.)?old\.dmsp\.de$
   RewriteRule ^(.*)$ http://new.dmsp.de/ [R=301,L]
<IfModule>

Varnish Redirect Example

sub vcl_recv {
   if (req.http.host ~ "^(www\.)?old\.dmsp\.de") {
      set req.http.host = "old.dmsp.de";
      error 301;
   }
}

sub vcl_error {
   if (obj.status == 301 && req.http.host == "old.dmsp.de") {
      set obj.http.Location = "http://new.dmsp.de/";
      set obj.status = 301;
      return (deliver);
   }
}

One important difference between realizing a 301 redirect with Apache or Varnish is that you will not be able to cache a 301 when using Varnish for the redirect (because you do not generate a cacheable object). When using Apache for the redirect, you can easily configure Apache to send a ‚max-age‘ header with the 301 status reply and obviously you have a cacheable object (the ‚Location:‘ header is only a part of it). Varnish will interpret the ‚max-age‘ according to RFC2616 and will set the TTL of the object to 120 seconds (which is easily modifiable from inside the VCL).