我正在编写一个nginx模块,该模块有望在向客户端发送回复之前加载远程文件。
用户在URL中传递ID。我使用该ID将URL加载到远程文件。我的测试看起来像这样:
wget http://example.com/?id=123
ID 123
被转换为URL,例如
http://other.example.com/image/cute.png
现在,我需要从nginx
模块中加载cute.png
。我可以使用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个错误:
<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连接从第三方网站获取文件...
在这样一个简单的语句中,有什么想法可能是错误的吗?
好吧,我为我的情况找到了一个解决方案,尽管我不太喜欢它。
我将URL更改为不包括协议,因此而不是使用:
http://other.example.com/image/cute.png
我将使用:
/other.example.com/image/cute.png
,当您还添加类似的proxy_pass
选项时,它可以与ngx_http_subrequest()
配合使用:
location /other.example.com {
proxy_pass http://other.example.com/;
}
所以我认为这是非常有问题的,因为您需要每个第三方域添加一个proxy_pass
。话虽如此,您可以使用许多东西,例如用于代理数据的缓存。例如,如果您不希望文件每月更改一次以上,则可以在本地缓存这些第三方文件,并且第二次访问速度会更快。
因此,可以使用nginx获取远程文件,只是不可能仅使用任何URL。至少,从我可以看到的proxy_pass
来看,不允许动态分配域名本身。