An experimental VCL extension to squash client Accept-Language headers
Perl C VCL
Latest commit f8cb023 Jan 25, 2012 @cosimo Merge pull request #5 from arthurlogilab/patch-2
complete insert for C extension
Failed to load latest commit information.
examples Update sample to Varnish 3 syntax. Nov 10, 2011
t Explicitly test for unspecified 'q' values Nov 3, 2011
.gitignore Initial import Jan 21, 2010
Makefile No need to change the Makefile to specify languages Sep 4, 2010
README Merge pull request #5 from arthurlogilab/patch-2 Jan 25, 2012
accept-language.c Better VCL integration. Now should be reasonably generic. Jan 22, 2010


Varnish Accept-Language VCL

Last updated: 03/11/2011
	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) Run 'make' informing the list of languages your site supports
   and the default fallback in the command line, e.g.


2) Run '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).

6) Restart Varnish

7) Cross your fingers

8) Profit !!