Redirigir a otro servidor y dominio si no se encuentra el archivo

Redirigir a otro servidor y dominio si no se encuentra el archivo

Migré de Apache a Nginx, así que quiero establecer todas las reglas en Nginx.

Meta:Redirigir una URL a otro dominio con el mismo nombre de archivo si ese archivo no se encuentra en el servidor solicitado.

Ejemplo

Si un usuario abrehttps://www.example.com/data/1.jpgentonces mi servidor intentará encontrar "1.jpg" en el directorio "datos". Si no se encuentra ese archivo, redirija al usuario a la URL del servidor de respaldo comohttps://www.example2.com/backup/1.jpg

Ejemplo en .htaccess

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

lo que he probado

  1. Busque soluciones existentes pero no encontré ninguna que funcione.
  2. Intente convertir la configuración de Apache a la configuración de Nginx a través de convertidores, pero no funciona.

Algunos intentaron la configuración pero no funcionaron.

    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;
    }

Respuesta1

Obtuve la solución después de modificar la respuesta de @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 ;
}

Respuesta2

En nginx usarías untry_files directiva, que sirve el contenido de un archivo local, si existe en uno (o más) directorios locales. Cuando no se encuentra ningún archivo, se realiza una redirección interna a la uri especificada en el último parámetro.

Dado que eso no se puede redirigir externamente, necesitas un poco de truco y un enfoque de dos niveles. En las opciones de try_files, utiliza la ubicación con nombre para esa redirección interna y, desde esa ubicación con nombre, construye la redirección externa.

location / {
    try_files  $uri  @externalbackup;
}

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

El código anterior no está probado.

información relacionada