Moving a redirect from backend to varnish
Kenneth Rørvik
Kenneth.Rorvik at hio.no
Wed Jan 17 09:08:11 CET 2007
Hi there. I am currently responsible for a reasonably large cms
(http://www.hio.no). Now, the problem is, my predecessor has *not*
implemented a cache for this site, and the server is getting loaded down
quite heavily due to many mysql-requests.
Enter varnish (1.0.2-7 on Red Hat AS4) .... but, there is a problem:
poorly documented vcl ;)
One of the most important aspects about the site is that we have an
apache-rewrite on "/" for all http-requests from our OWN networks when
there is no Referer header set. The reason is we (or, our information
department.... ;) want all internal requests to / to end up on the news
page on first open, and subsequent clicks on links to / to actually take
you to /.
Now, a proxy will certainly mess up this apache rewrite. The apache
rewrite itself looks like this (truncated for brevity):
RewriteCond %{REMOTE_ADDR} ^128\.39\.75\.* [OR]
RewriteCond %{REMOTE_ADDR} ^128\.39\.89\.* [OR]
RewriteCond %{REMOTE_ADDR} ^2001:700:700:\.*
RewriteCond %{HTTP_REFERER} !^http://www\.hio\.no
RewriteRule ^/$ /content/view/full/27 [R=permanent,L]
A rather simple redirect.
The problem is, with varnish in place, this will of course not have the
desired effect. the vcl man page tells us a few things, but there have
been some problems implementing this redirect.
At the moment, I am playing with using an acl to check if the client is
on an internal network, and then see if Referer is set and the page
being requested is /, and then act accordingly.
There are two problems in this. The first is making the test act
accordingly, the second is the acl syntax.. first, the test. I am
currently using something like:
if (client ~ internal && req.url == "/" && req.http.referer) {...}
The acl uses a syntax which I've noticed in the list archives for this
list is possibly bugged for checking IP's (?):
acl internal {
"158.36.161.1"/24;
"158.36.78.1"/23;
...
...
}
Now, the man page uses .1 for the IPs, but .0 should be more intuitive?
Also the /24 should probably be placed inside the quotes?
Now, provided I get the right test in place - the next question is how
to handle the redirect itself. You could either send the request on to
the backend (but this is not good caching... ;), using pipe (?), or we
could tell the client directly that the document is moved, and what the
correct url is. But how could I get varnish to simply say "beeeep, no,
go to THIS page instead" using something like a http 301?
Or is there another solution that the current documentation does not expose?
Oh, and is there any need for credits to the varnishproject if I use it
on http://www.hio.no?
--
Kenneth Rørvik, IT HiO
Tlf 22 45 20 83
Kenneth.Rorvik at hio.no
More information about the varnish-misc
mailing list