nginx:基于 cookie 的不同配置

nginx:基于 cookie 的不同配置

我们正在对网站进行重大重构。在推出新版本时,我们希望开始将一小部分用户引导到新版本。我们不希望他们在新旧版本之间来回切换,因此我们计划在他们第一次访问时设置一个 cookie,然后使用它来决定要做什么。

我们知道如何使所有这些工作,除了根据 cookie 更改 nginx 配置。除了我们需要使用不同的根目录外,配置基本相同,并且 try_files 在两者之间也不同,因为旧版本的结构类似于 page_name/index.php,而新版本通过一个 index.php 文件路由所有内容。

对于基于 cookie 更改根,我使用 map 来实现,但我不确定如何处理 try_files 部分。我试图避免使用基于 if-is-evil 的 if。旧版本根本不使用 try_files,而新版本使用try_files $uri $uri/ /index.php?$args;

如果不使用 if,最好的处理方法是什么?或者在这种情况下我们可以安全地使用 if 吗?

答案1

我相信这只有使用 NGINX Plus 才有可能sticky route

看一下https://www.nginx.com/blog/performing-ab-testing-nginx-plus/

答案2

我认为我们可以用以下方法处理openresty

这是例子

nginx 配置文件
server {
    listen 8081;
    server_name localhost;
    location / {
        content_by_lua_block {
            ngx.say('8081 version')
        }
    }
}
server {
    listen 8082;
    server_name localhost;
    location / {
        content_by_lua_block {
            ngx.say('8082 version')
        }
    }
}
server {
    listen 80;
    server_name localhost;

    location / {
        set $versionupstream  "";
        rewrite_by_lua_block {
            local newcookie = ngx.var.cookie_Foo

            if newcookie == "bar" then
                ngx.var.versionupstream = "127.0.0.1:8081"
            else
                ngx.var.versionupstream = "127.0.0.1:8082"
            end
        }

        proxy_pass http://$versionupstream;
    }
}
测试一下

演示它

相关内容