Search code examples
ccachinglowercasevarnish

Lowercase urls in Varnish (inline C)


In Varnish (3.0), urls are treated in a case sensitive way. By that I mean http://test.com/user/a4556 is treated differently from http://test.com/user/A4556. On my web server they're treated as the same url. What I'd like to do is have varnish lowercase all request urls as they come in.

I managed to find this discussion but the creator of Varnish indicates that I will have to use inline C to do it. I could achieve this in a simplistic way using multiple regexes but that just seems like it's bound to fail.

Ideally, what I'd like is a VCL configuration to do this (an example of this can be found here) but I'd settle for a C function that takes in a const char * and returns const char * (I'm not a C programmer so forgive me if I get the syntax wrong).


Solution

  • It must be mentioned that Varnish includes the ability to uppercase and lowercase strings in the std vmod ( https://www.varnish-cache.org/docs/trunk/reference/vmod_std.generated.html#func-tolower )

    This is much cleaner than the embedded C route (which is disabled by default in Varnish 4). Here's an example I use to normalize the request Host and url;

        import std;
    
        sub vcl_recv {
    
          # normalize Host header
          set req.http.Host = std.tolower(regsub(req.http.Host, ":[0-9]+", ""));
          ....
    
        }
    
        sub vcl_hash {
          # set cache key to lowercased req.url 
          hash_data(std.tolower(req.url));
          ....
        }