1

特定の場所に一致する受信リクエストに対して、やや複雑なロジックを実行する必要があります。つまり、 に準拠するすべての URL に対してlocation ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/?$"、次のことを行う必要があります。

  1. 管理者 Cookie が存在するかどうかを確認します。もしそうなら:
    • URL の書き換え ( /<uuid>-> /mod/<uuid>)
    • 実行uwsgi_pass
  2. そうしないと:
    • UUID に一致するエントリについて、postgres でルックアップを実行します。
    • 使用可能なリダイレクト URL のエントリを検索します
    • 選択した URL にクライアントをリダイレクトします

ビットcontent_by_lua_blockを除いて、これはすべて を使用してかなり簡単です。uwsgi_passGoogle は、この取り組みにおいて最も役に立たないことが証明されています...

uwsgi_passで を実行するにはどうすればよいcontent_by_lua_blockですか?

4

1 に答える 1

2

少し遅くなりましたが、以下です。

location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$" {
          set $uuid $1;                  
          rewrite_by_lua ' 
            local new_url
            if (ngx.var.cookie_admin) then
              new_url = "/modif/" .. ngx.var.uuid                
            else               
              --Get the url from DB using uuid
              local res = ngx.location.capture("/url/" .. ngx.var.uuid);                   
              if (res.status == 200 and res.body)  then 
                new_url = tostring(res.body) --change the uri to the one from DB                  
              else 
                return ngx.exec("@notfound") -- Fallback locaton if no url found in DB
              end               
            end
            ngx.req.set_uri(new_url) -- rewrite uri to new one
          ';
          echo $uri; #test
          #uwsgi_pass upstream_server;
    }

テスト用のこの2つの場所で、うまくいきました:

location ~ "^/url/(.+)$" {
  internal;      
  set $uuid $1;
  #return 410; # test Uncomment to test @notfound
  echo "/url/from/db/$uuid"; #test   

  #assuming you have postgre module
  #postgres_pass     database;
  #rds_json          on;
  #postgres_query    HEAD GET  "SELECT url FROM your_table WHERE uuid='$uuid'";
  #postgres_rewrite  HEAD GET  no_rows 410;
}

location @notfound {
  echo "Ping!  You got here because you have no cookies!";
}
于 2016-02-14T00:07:08.290 に答える