Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Varnish VCL "plugin" that geolocates client IP addresses (requires geoip)
C Perl
Tree: 2fa84a7b4c

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


Varnish Accept-Language VCL

Last updated: 22/01/2010
	Cosimo Streppone <>
	Opera Software ASA

Here you will find a VCL config file for Varnish (
This VCL allows you to normalize and filter all the incoming requests
Accept-Language headers and reduce them to just the languages your site supports.

*** WARNING ***
This VCL consists of C code. Your Varnish might explode. YMMV.
Don't use it in production if you don't know what you're doing.
We are using it in production, but we _don't_ know what we're doing :).

Why would you want this?
Your site supports English and Japanese languages.
Your client browsers will send every possible Accept-Language header on Earth.
If you enable "Vary: Accept-Language" on Varnish or on your backends,
the cache hit ratio will rapidly drop, because of the huge variations
in Accept-Language contents.

With this VCL, the Accept-Language header will be "rewritten" to just
"en" or "ja", depending on your client settings. If no match occurs,
you can select a default language.

The rewritten header is "X-Varnish-Accept-Language".
You can choose to put this header back in "Accept-Language" if you wish.
In this way, the normalization will be completely transparent.


- gcc, make
- a recent perl, with `prove'


1) Configure the list of languages your site supports
   and the default fallback in the Makefile, *NOT* in the C code.

2) Run 'make && make test'
   You should see "All tests successful" at the end of the execution

3) Install the generated accept-language.vcl in /etc/varnish/

4) At the top of your main VCL file, add the following line:

     include "/etc/varnish/accept-language.vcl"

   and then in your vcl_recv() add:


   This will parse Accept-Language and insert the final language into the
   "X-Varnish-Accept-Language" header (req.http.X-Varnish-Accept-Language).

   or optionally specifying a custom header name. You need the length of
   the string in octal before it, and a colon (":") after. Example:


6) Restart Varnish

7) Cross your fingers

8) Profit !!

Something went wrong with that request. Please try again.