У меня на сервере следующая иерархия папок:
/var/images/d/d8/d82fa6c3eed/image.png
Структура каталогов создается на основе хэша MD5 и разбивается на подпапки.
Я хотел бы обслуживать изображения веб-пользователям с помощью Nginx, но не хочу раскрывать структуру каталогов. Например, я делаю так:нетхотите обслуживать файлы следующим образом:
http://domain.tld/d/d8/d82fa6c3eed/image.png
Я хочу подать его примерно так:
http://domain.tld/b/4324re3fg34f6td/image.png
Я также использую secure link
модуль nginx, но вам придется указать каталог для получения изображения, например так:
http://domain.tld/b/<secure link MD5 hash>/path/to/file.png
который переписывается в:
http://domain.tld/images/path/to/file.png?md5=<secure link md5>
и я не хочу указывать фактический конкретный путь к каталогу в моей файловой системе, чтобы получить файл. Я думал о следующем:
- клиент может отправить некое значение MD5, представляющее путь к каталогу файла, и NGINX вставит / через каждые N символов. Возможно ли это?
- отправить путь к каталогу, закодированный в base64, и заставить NGINX декодировать его и внутренне перенаправить туда. А это?
- может быть, использовать для этого дополнительный модуль, например, модуль OpenResty?
Могу ли я этого добиться?
Мой конфиг nginx:
server {
..
root /var/www/html;
..
location /b/ {
rewrite ^/b/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.*)$ /images/$2/$3?md5=$1 last;
}
location /images/ {
internal;
secure_link $arg_md5;
secure_link_md5 '$uri mysecretkey';
if($secure_link = "") { return 404; }
if($secure_link = "0") { return 410; }
}
}
решение1
Я не использовал secure_link
, поэтому не могу прокомментировать эту часть вашего предложения. Но очевидная ошибка в вашей конфигурации заключается в том, что вы должны использовать , rewrite...last
если хотите, чтобы переписанный URI обрабатывался блоком location /images/
. break
Суффикс заставляет URI обрабатываться в том же месте.
Видетьэтот документдля получения подробной информации.