当且仅当存在cookie时,我想将URL重定向到Django平台(通过uwsgi)。如果做不到这一点,我需要将执行推迟到content_by_lua
插件。
以下是我对这种逻辑的尝试:
location ~* "^/[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$" { # match a UUID v4
include uwsgi_params;
if ($cookie_admin) {
# if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi
rewrite ^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$ /modif/$1 break;
uwsgi_pass frontend;
}
content_by_lua '
ngx.say("Ping! You got here because you have no cookies!")
';
}
Nginx认为用以下日志信息侮辱我的情报是必要和恰当的:
nginx: [emerg] directive "rewrite" is not terminated by ";" in /opt/openresty/nginx/conf/nginx.conf:34
也许我像nginx似乎一样密集,但我错过了什么?
奖金问题:我的一般做法是否安全和理智?有没有更好的方法来实现我的目标?
答案 0 :(得分:3)
这对我来说实际上是一件非常愚蠢的事情。 Nginx使用大括号{}
来分隔块,因此当在regex中使用它们时,表达式必须用双引号括起来。
答案 1 :(得分:1)
奖励回答:此外,您可以在匹配位置期间捕获UUID值,以避免重写上的其他正则表达式,如下所示:
location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$" { # match and capture a UUID v4
include uwsgi_params;
set $uuid $1;
if ($cookie_admin) {
# if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi
rewrite / /modif/$uuid break;
uwsgi_pass frontend;
}
content_by_lua '
ngx.say("Ping! You got here because you have no cookies!")
ngx.say("UIID: " .. ngx.var.uuid)
';
}