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).