Nginx reescreve a URL apenas se o arquivo existir

12

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.

    
por Jose Fernandez 14.03.2010 / 09:49

3 respostas

19
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.

    
por 14.03.2010 / 11:24
5

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 19.03.2011 / 00:47
4

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.

    
por 09.03.2017 / 22:40

Tags