Как загрузить файл с помощью URL-адреса из модуля nginx? - PullRequest
0 голосов
/ 15 марта 2019

Я пишу модуль nginx, который должен загрузить загрузку удаленного файла перед отправкой ответа клиенту.

Пользователь передает идентификатор в URL. Я использую этот идентификатор для загрузки URL-адреса в удаленный файл. Мой тест выглядит примерно так:

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

Идентификатор 123 преобразуется в 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 */
}

Однако вместо ответа со стороннего веб-сайта я получаю 404 ошибки со следующим HTML-кодом:

<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 голосов
/ 15 марта 2019

Хорошо, я нашел решение для своего случая, хотя мне оно не очень нравится.

Я изменил 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 не позволяет динамически назначать само доменное имя.

...