0

我正在编写一个 nginx 模块,该模块预计会在向客户端发送回复之前加载加载远程文件。

用户在 URL 中传递一个 ID。我使用该 ID 将 URL 加载到远程文件。我的测试看起来像这样:

wget http://example.com/?id=123

id123被转换为 URL,例如

http://other.example.com/image/cute.png

现在我需要cute.png从我的nginx模块中加载。我可以用一个ngx_request或一个来做到这一点ngx_upstream吗?我无法找到任何明确的文档来说明如何做到这一点......


更新:

我现在(终于!)找到了子请求功能

ngx_int_t            rc;
ngx_str_t            uri;
ngx_http_request_t  *sr;

...

/* THIS IS WHAT WAS WRONG */
ngx_str_set(&uri, "http://other.example.com/image/cute.png");

rc = ngx_http_subrequest(r, &uri, NULL, &sr, NULL, 0);
if (rc != NGX_OK) {
    /* error */
}

但是,我收到以下 HTML 代码的 404 错误,而不是来自 3rd 方网站的答案:

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>

我的感觉是,现在它查询我的 nginx 服务器,而不是使用外部 TCP 连接从 3rd 方网站获取文件......

知道为什么这么简单的陈述会出错吗?

4

1 回答 1

0

好的,我找到了适合我的情况的解决方案,尽管我不太喜欢它。

我将 URL 更改为不包含协议,因此不使用:

http://other.example.com/image/cute.png

我将使用:

/other.example.com/image/cute.png

ngx_http_subrequest()当您还添加proxy_pass如下选项时,效果很好:

location /other.example.com {
    proxy_pass http://other.example.com/;
}

所以我认为这是非常有问题的,因为您需要为proxy_pass您访问的每个第三方域添加一个。话虽如此,您可以使用许多东西,例如代理数据的缓存。例如,如果您不希望文件每月更改一次以上,您可以在本地缓存这些 3rd 方文件,并且在第二次和进一步访问时速度会快得多。

所以可以使用 nginx 获取远程文件,只是不能使用任何 URL。至少,据我所知,proxy_pass不允许动态分配域名本身。

于 2019-03-15T18:53:03.077 回答