location /images/ {
if (-f $request_filename) {
break;
}
rewrite ^/images/(.*) /new_images/$1 permanent;
}
No entanto, você pode querer bugar seu host para atualizar ou encontrar um host melhor.
Eu preciso escrever uma regra de reconfiguração para o Nginx para que, se um usuário tentar acessar um URL de imagem antigo:
/images/path/to/image.png
e o arquivo não existe, tente redirecionar para:
/website_images/path/to/image.png
SOMENTE se a imagem existir no novo URL, caso contrário continue com o 404. A versão do Nginx em nosso host ainda não tem try_files.
Você poderia usar algo assim (não testado para o seu caso específico):
location ^/images/(?<imgpath>.*)$ {
set $no_old 0;
set $yes_new 0;
if (!-f $request_filename)
{
set $no_old 1;
}
if (-f ~* "^/new_path/$imgpath")
{
set $yes_new 1$no_old;
}
# replacement exists in the new path
if ($yes_new = 11)
{
rewrite ^/images/(.*)$ /new_path/$1 permanent;
}
# no image in the new path!
if ($yes_new = 01)
{
return 404;
}
}
Que é basicamente uma maneira alternativa de escrever instruções if
aninhadas, já que você não pode aninhar no Nginx. Veja aqui para referência oficial sobre este "hack".
Por favor, não use if
dentro de um bloco de localização. Coisas ruins podem acontecer.
location ~* ^/images/(.+)$ {
root /www;
try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}
$1
se torna o nome do arquivo a ser testado na diretiva try_files, criada para o que você está tentando realizar.
Isto, OU, apenas reescreva-o sem verificar. Se essa imagem não estiver lá, você receberá um 404 de qualquer maneira.