为什么nginx声称我的`rewrite`语句中没有终止分号?

时间:2016-01-17 22:50:38

标签: nginx openresty

当且仅当存在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似乎一样密集,但我错过了什么?

奖金问题:我的一般做法是否安全和理智?有没有更好的方法来实现我的目标?

2 个答案:

答案 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)
 ';
}