Как загрузить файл с помощью URL-адреса из модуля nginx?
Я пишу модуль 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 ответ
Хорошо, я нашел решение для своего случая, хотя мне это не очень нравится.
Я изменил 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
не позволяет самому имени домена быть назначенным динамически.