3

Cookie が存在する場合にのみ、URL を (uwsgi 経由で) Django プラットフォームにリダイレクトしたいと考えています。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 が考えているほど密集していますが、何を見逃したのでしょうか?

おまけの質問:私の一般的なアプローチは安全で正気ですか? 私の目標を達成するためのより良い方法はありますか?

4

2 に答える 2

12

これは実際、私が間違っていたのは非常にばかげたことです。Nginx は中かっこ{}を使用してブロックを区切るため、これらを正規表現で使用する場合は、式を二重引用符で囲む必要があります。

于 2016-01-17T23:33:09.387 に答える
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)
 ';
}
于 2016-01-18T00:10:40.497 に答える