我正在编写一个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连接从第三方网站获取文件...
在这样一个简单的陈述中,有什么想法会出错吗?
答案 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
不允许动态分配域名本身。