如何在nginx模块中使用URL加载文件?

时间:2019-03-15 00:18:13

标签: nginx nginx-module

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

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

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

id 123被转换为URL,例如

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

现在,我需要从cute.png模块中加载nginx。我可以使用ngx_request还是ngx_upstream来做到这一点?我找不到任何清晰的文档来说明如何做到这一点...


更新:

我现在(终于!)找到了sub-request function

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错误,而不是第三方网站的答复:

<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连接从第三方网站获取文件...

在这样一个简单的陈述中,有什么想法会出错吗?

1 个答案:

答案 0 :(得分: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。就是说,您可以使用许多功能,例如代理数据的缓存。例如,如果您不希望文件每月被更改超过一次,则可以在本地缓存这些第三方文件,这样在第二次访问和进一步访问时会更快。

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