location ~ ^/([a-zA-Z0-9_]+)/ {
set $username $1;
you can use named captures location ~ ^/(?<username>[a-zA-Z0-9_]+)/ {http://serverfault.com/questions/268633/controlling-nginx-pr...
We want to allow our users to enable beta version for all visitors to their Mixlr page, not just for themselves.
But a cookie approach would be easy too - see my other comment for a simple example.
However I wonder if map is faster than using lua just for cookies. I'll have to test it. :)
Its scripting language is very simple (not quite as nice as Lua, IMHO), but it supports multiple backends and rewriting arbitrary headers: https://www.varnish-cache.org/trac/wiki/VCLExamples
While it's not as clean as having the check done in nginx itself via Lua script + Redis, it's relatively low friction. That said, the Lua script embedded in the nginx config is very slick, and I had been contemplating writing something similar using the nginx memcache module. Nice work.
However having a beta.mixlr.com domain a) introduces a lot of friction and seriously reduces the ease with which you can test features b) may alter the perception or expectations of a visitor, making testing less valid.
We've got a lot of users and we want to make the roll-out process completely transparent and inclusive.
Hence this solution.
Personally, I would probably take the approach of settings a cookie per user. This would be very suitable when beta testing is enabled/decided by users, rather than a subset being chosen A/B style based on a value in the database. This would have the advantage that nginx would not have to make any database requests; just check a cookie on the request, likely speeding up the speed at which nginx handles requests. However, it would require some changes to the application (versus [small] changes to the database which the slug approach) to set the cookie etc.
I wonder how easy this is to do in apache.
local is_some_cookie_set = nginx.var.cookie_SomeCookie ~= nil;
Then you don't need Redis at all. For us though, we want to separate users by the URL and then a check at an application level variable, so I think this is the right approach still.