How to send only whitelisted http headers to backend?

Jeff Potter jpotter-varnish at codepuppy.com
Thu Oct 17 12:49:02 UTC 2019


Thanks, Geoff and Dridi! We’ll give this a try.

And Dridi, thanks also for maintaining varnish and this list — “long time lurker; very rare poster” — since I have the microphone, just wanted to send a short note of appreciation.

-Jeff

> On Oct 16, 2019, at 1:36 PM, Dridi Boukelmoune <dridi at varni.sh> wrote:
> 
> On Wed, Oct 16, 2019 at 4:08 PM Geoff Simmons <geoff at uplex.de> wrote:
>> 
>> On 10/15/19 16:21, Jeff Potter wrote:
>>> 
>>> This seems like an easy task, but I haven’t been able to figure out
>>> how to do it or find any posts online. Is there a way to only send
>>> certain headers to a backend?
>>> 
>>> I.e. in our application, we know we only need X-Forwarded-For and
>>> Cookie headers. I know I can unset other known headers (User-Agent, etc)
>>> — but how can I unset *all* other headers?
>> 
>> VMOD re2 has the .hdr_filter() method for the set object:
>> 
>> https://code.uplex.de/uplex-varnish/libvmod-re2
>> 
>> https://code.uplex.de/uplex-varnish/libvmod-re2/blob/master/README.rst#L1775
>> 
>> VOID myset.hdr_filter(HTTP, BOOL whitelist)
>> 
>> The HTTP parameter can be one of req, resp, bereq or beresp. If the
>> whitelist parameter is true (default true), then only matching headers
>> are retained. Otherwise it's a blacklist -- matching headers are removed.
>> 
>> So for your use case:
>> 
>> sub vcl_init {
>>        new whitelist = re2.set(anchor=start, case_sensitive=false);
>>        whitelist.add("X-Forwarded-For:");
>>        whitelist.add("Cookie:");
>>        whitelist.add("Host:");
>>        whitelist.compile();
>> }
>> 
>> sub vcl_backend_fetch {
>>        whitelist.hdr_filter(bereq);
>> }
> 
> TIL, thanks!
> 
>> I took the liberty of adding the Host header to your whitelist, since
>> it's required since HTTP/1.1. Even if your backends "happen" to work
>> without it, I wouldn't leave it out, since it's not well-formed HTTP
>> otherwise (might stop working, for example, if the backend apps are
>> upgraded).
> 
> Agreed, there are other control headers that one may want to keep in
> the whitelist, otherwise you may break conditional or partial requests,
> and everything else I don't remember off the top of my head.


More information about the varnish-misc mailing list