Ocultar a estrutura de pastas no servidor para imagens com nginx

Ocultar a estrutura de pastas no servidor para imagens com nginx

Eu tenho a seguinte hierarquia de pastas no meu servidor:
/var/images/d/d8/d82fa6c3eed/image.png

A estrutura de diretórios é criada a partir de um hash MD5 e dividida em subpastas.

Gostaria de servir as imagens para usuários da web com Nginx, mas não quero expor a estrutura de diretórios. Por exemplo, eu façonãodeseja servir os arquivos assim:
http://domain.tld/d/d8/d82fa6c3eed/image.png

Quero servir algo como:
http://domain.tld/b/4324re3fg34f6td/image.png

Também estou usando o secure linkmódulo nginx, mas você precisa especificar o diretório para obter a imagem, assim:
http://domain.tld/b/<secure link MD5 hash>/path/to/file.png

que é reescrito em:
http://domain.tld/images/path/to/file.png?md5=<secure link md5>

e não quero especificar o caminho do diretório específico em meu sistema de arquivos para obter o arquivo. Eu estava pensando nas seguintes linhas:

  • o cliente pode enviar algum tipo de valor MD5 que representa o caminho do diretório para o arquivo, e o NGINX inserirá / cada N caractere. Isso é possível?
  • envie o caminho do diretório codificado em base64 e faça com que o NGINX o decodifique e redirecione internamente para lá. E isto?
  • talvez use um módulo extra para isso, como o módulo openresty?

Posso conseguir isso ..?

Minha configuração 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; }
    }
}

Responder1

Não usei secure_link, então não posso comentar essa parte da sua proposta. Mas um erro óbvio na sua configuração é que você deve usar rewrite...lastse quiser que o URI reescrito seja processado pelo location /images/bloco. O breaksufixo faz com que o URI seja processado no mesmo local.

Veresse documentopara detalhes.

informação relacionada