NGINX从proxy_pass响应读取主体

问题描述 投票:3回答:1

我有两个服务器:

  1. NGINX(它将文件ID交换到文件路径)
  2. Golang(它接受文件ID并返回它的路径)

Ex:当浏览器客户端向https://example.com/file?id=123发出请求时,NGINX应将此请求代理到Golang服务器https://go.example.com/getpath?file_id=123,它将把响应返回给NGINX:

{
  data: {
    filePath: "/static/..."
  },
  status: "ok"
}

然后NGINX应该从filePath获取值并从该位置返回文件。

所以问题是如何在NGINX中读取响应(获取filePath)?

nginx lua proxypass
1个回答
0
投票

看起来您想对数据进行api调用,以运行决策和逻辑。这不是代理的全部内容。

nginx的核心代理功能不是针对您要执行的操作而设计的。

可能的解决方法:扩展nginx ...


Nginx + PHP

您的php代码将完成此工作。充当客户端连接到Golang服务器,并将其他逻辑应用于响应。

<?php
    $response = file_get_contents('https://go.example.com/getpath?file_id='.$_GET["id"]);
    preg_match_all("/filePath: \"(.*?)\"/", $response, $filePath);
    readfile($filePath[1][0]);
?>
    location /getpath {
        try_files /getpath.php;
    }

这只是使它滚动的伪代码示例。

一些其他观察/评论:

  • Golang响应看起来不是有效的json,如果是,则将preg_match_all替换为json_decode。
  • readfile不是超级有效。考虑使用302响应来发挥创意。

Nginx + Lua

启用站点:

lua_package_path "/etc/nginx/conf.d/lib/?.lua;;";

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location /getfile {
        root /var/www/html;
        resolver 8.8.8.8;
        set $filepath "/index.html";
        access_by_lua_file /etc/nginx/conf.d/getfile.lua;
        try_files $filepath =404;
    }
}

测试lua是否表现出预期的效果:

getfile.lua(v1)

  ngx.var.filepath = "/static/...";

简化Golang响应主体,使其仅返回平淡的路径,然后使用它来设置文件路径:

getfile.lua(v2)

local http = require "resty.http"
local httpc = http.new()
local query_string = ngx.req.get_uri_args()
local res, err = httpc:request_uri('https://go.example.com/getpath?file_id=' .. query_string["id"], {
    method = "GET",
    keepalive_timeout = 60,
    keepalive_pool = 10
})

if res and res.status == ngx.HTTP_OK then
    body = string.gsub(res.body, '[\r\n%z]', '')
    ngx.var.filepath = body;
    ngx.log(ngx.ERR, "[" .. body .. "]");
else
    ngx.log(ngx.ERR, "missing response");
    ngx.exit(504);
end

resty.http

mkdir -p /etc/nginx/conf.d/lib/resty
wget "https://raw.githubusercontent.com/ledgetech/lua-resty-http/master/lib/resty/http_headers.lua" -P /etc/nginx/conf.d/lib/resty
wget "https://raw.githubusercontent.com/ledgetech/lua-resty-http/master/lib/resty/http.lua" -P /etc/nginx/conf.d/lib/resty
© www.soinside.com 2019 - 2024. All rights reserved.