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 link
mó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...last
se quiser que o URI reescrito seja processado pelo location /images/
bloco. O break
sufixo faz com que o URI seja processado no mesmo local.
Veresse documentopara detalhes.