Как отдать статичный файл и при этом проверить, имеет ли данный запрос на это право.
В Ngnix есть модуль
http_auth_request, с помощью которого можно прозрачно авторизовать любой запрос, в том числе к статике. Применение может быть разнообразное. Например, можно будет дать кому-либо URL и ограничить срок его годности на 5 минут.
server {
listen: 80;
server_name static.example.com;
root /var/www/static;
location / {
auth_request /auth_static_files;
}
location /auth_static_files {
internal;
proxy_pass http://auth.example.com/check;
proxy_pass_request_body off;
proxy_set_header Content-Length "0";
proxy_set_header X-Original-URI $request_uri;
}
Сервис auth.example.com/check получит X-Original-URI, примет решение и ответит 403 или 200. На что Ngnix либо тоже скажет 403, либо попробует отдать запрошенный файл. Из сервиса можно даже вернуть какие-либо данные в виде строк заголовка и потом добавить их в заголовок исходного запроса.
Данные для авторизации я решил передавать прямо в оригинальном запросе в зашифрованном виде. По первоначальной задумке сервис авторизации должен был выдать реальное имя файла, которое я подставлю через rewrite. Примеру:
Исходный URI: /GHFGHghjHGhjghjHJGhjty78TYUYFGUYfTYFghfgh=
Итоговый URI: /some_file.txt
К сожалению, лог уровня debug показал, что Nginx сперва выполняет rewrite и только потом выполняет авторизацию. Т.е. имя файла все равно нужно указать в строке. Получается:
Исходный URI: /some_file.txt?GHFGHghjHGhjghjHJGhjty78TYUYFGUYfTYFghfgh=
Итоговый URI: /some_file.txt
Вопрос: кто-нибудь еще этим вопросом интересовался? Получилось ли не подставлять имя файла в исходный URI?