如何使用来自NGINX模块中的URL加载文件



我正在编写一个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_requestngx_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来看,不允许动态分配域名本身。

相关内容

  • 没有找到相关文章

最新更新