代码之家  ›  专栏  ›  技术社区  ›  Sankar

基于JSON主体的nginx过滤

  •  1
  • Sankar  · 技术社区  · 6 年前

    我有一个Java API服务器坐在NGNIX服务器后面。nginx服务器提供https、速率限制、日志记录、分析等。

    有一个特定的HTTP端点 /my-file-upload/{:file-id} 它占用类型为的JSON主体:

    {
      FileName: <string>,
      Content: <base 64 encoded string>,
    }
    

    这需要由这种服务器组合来处理。

    Java服务器处理实际的文件内容处理。但是,我希望有一个可以从NGNX服务器传递到Java服务器的各种文件扩展(不一定是来自身体的文件魔术)的白名单。

    例如,我希望通过筛选 FileName 请求主体JSON的字段。到目前为止,我已经使用了基于 location 用于筛选URL。但是,在这里,我想根据请求主体进行过滤,在nginx中是否有使用配置文件实现这一点的标准方法,或者我需要编写任何插件,或者是否有任何标准插件来实现这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   miknik    6 年前

    XMLHttpRequest.setRequestHeader() X-Filetype: pdf

    if ($http_x_filetype !~ (pdf|txt)) {
        return 415;
    }
    

    415 Unsupported Media Type

    if

    auth_request

    nginx -V 2>&1 | grep -qF -- --with-http_auth_request_module && echo ":)" || echo ":("
    

    在上传位置块中,您为nginx设置了一个内部位置,以便在每次请求时调用。这个子请求的响应代码决定nginx是否允许客户端访问。

    location /my-file-upload {
        auth_request /filecheck;
        ........
    }
    
    location /filecheck {
        internal;
        proxy_pass http://127.0.0.1/my-auth-script.php; #or whatever
        proxy_set_header X-Filehex $http_x_filehex;
        ....
    }
    

    将所需的任何信息传递给内部脚本,该脚本执行文件类型验证和客户机标识。预期文件的MD5散列,预期文件大小,无论是什么都可以确保如果允许上载,那么您得到的文件就是您期望得到的文件。

    如果脚本满意,则返回200,否则返回403。然后,nginx在收到200个响应时代理到上传服务器,在收到403个响应时拒绝请求。