J'ai deux serveurs:
Ex: Lorsque le client du navigateur fait une demande à https://example.com/file?id=123
, NGINX devrait proxy cette demande au serveur Golang https://go.example.com/getpath?file_id=123
, qui renverra la réponse à NGINX:
{
data: {
filePath: "/static/..."
},
status: "ok"
}
Ensuite, NGINX devrait obtenir la valeur de filePath et renvoyer le fichier de l'emplacement.
La question est donc de savoir comment lire la réponse (obtenir filePath) dans NGINX?
Il semble que vous souhaitiez effectuer un appel API pour que les données exécutent la décision et la logique. Ce n'est pas tout à fait ça le mandataire.
La capacité proxy principale de nginx n'est pas conçue pour ce que vous cherchez à faire.
Solution possible: étendre nginx ...
Nginx + PHP
Votre code php ferait le travail de jambe.
Servir de client pour se connecter au serveur Golang et appliquer une logique supplémentaire à la réponse.
<?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;
}
Ceci est juste l'exemple de pseudo-code pour le faire rouler.
Quelques observations/commentaires divers:
Nginx + Lua
compatible avec les sites:
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;
}
}
Testez si lua se comporte comme prévu:
getfile.lua (v1)
ngx.var.filepath = "/static/...";
Simplifiez le corps de réponse de Golang pour simplement retourner un chemin fade, puis utilisez-le pour définir le chemin de fichier:
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
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