An experimental VCL extension to squash client Accept-Language headers
Perl C VCL
Switch branches/tags
Nothing to show
Pull request Compare This branch is 6 commits behind cosimo:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


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 !!