Redirecionar para outro servidor e domínio se o arquivo não for encontrado

Redirecionar para outro servidor e domínio se o arquivo não for encontrado

Migrei do Apache para o Nginx, então quero definir todas as regras no Nginx.

Meta:Redirecione um URL para outro domínio com o mesmo nome de arquivo se esse arquivo não for encontrado no servidor solicitado.

Exemplo

Se um usuário abrirhttps://www.example.com/data/1.jpgentão meu servidor tentará encontrar "1.jpg" no diretório "data". Se esse arquivo não for encontrado, redirecione o usuário para o URL do servidor de backup, comohttps://www.example2.com/backup/1.jpg

Exemplo em .htaccess

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [L]
RewriteRule (.*) https://example2.com/backup/$1 [L]

O que eu tentei

  1. Procure soluções existentes, mas não encontrei nenhuma solução funcional.
  2. Tente converter a configuração do Apache em configuração do Nginx por meio de conversores, mas não funciona.

Alguns tentaram configurar, mas não funcionaram.

    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 last;
        } 
    }


    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 permanent;
        } 
    }


    location ~ /data/.* {
        try_files $uri https://www.example2.com/backup/$uri;
    }

Responder1

Consegui a solução depois de modificar a resposta do @Rob.

set $v_filename nf;

location ~ ^/data/(.*)$ {
    try_files  $uri  @externalbackup;
    set $v_filename $1;
}

location @externalbackup {
     return 301  https://www.example2.com/backup/$v_filename ;
}

Responder2

No nginx você usaria umtry_files diretiva, que fornece o conteúdo de um arquivo local, se existir em um (ou mais) diretórios locais. Quando nenhum arquivo é encontrado, é feito um redirecionamento interno para o uri especificado no último parâmetro.

Como isso não pode redirecionar externamente, você precisa de um pouco de truque e de uma abordagem de dois níveis. Nas opções try_files você usa o local nomeado para esse redirecionamento interno e, a partir desse local nomeado, você constrói o redirecionamento externo.

location / {
    try_files  $uri  @externalbackup;
}

location @externalbackup {
     return 301  https://www.example2.com/backup$request_uri ;
}

O código acima não foi testado.

informação relacionada