我们正在对网站进行重大重构。在推出新版本时,我们希望开始将一小部分用户引导到新版本。我们不希望他们在新旧版本之间来回切换,因此我们计划在他们第一次访问时设置一个 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;
}
}
测试一下