Pregunta Nginx reescribe la URL solo si el archivo existe


Necesito escribir una regla de reescritura para Nginx para que si un usuario intenta ir a una url de imagen antigua:

/images/path/to/image.png

y el archivo no existe, intente redirigir a:

/website_images/path/to/image.png

SOLO si la imagen existe en la nueva URL, de lo contrario, continúe con el 404. La versión de Nginx en nuestro host todavía no tiene archivos de prueba.


12
2018-03-14 08:49


origen




Respuestas:


location /images/ {
    if (-f $request_filename) {
        break;
    }

    rewrite ^/images/(.*) /new_images/$1 permanent;
}

Sin embargo, es posible que desee hacer un error en su host para actualizar o encontrar un mejor host.


19
2018-03-14 10:24



Esto redireccionará a / new_images en cada 404 ¿verdad? No quiero volver a escribir a menos que sepa que existe el archivo new_images - Jose Fernandez
Esto comprueba si el archivo existe, y si esa prueba falla, redirige a new_images. Lo que sucede después de eso no se especifica aquí. - tylerl
Me temo que su opción es considerada como una trampa común por los autores de nginx nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/… - riverfall
@riverfall Heh, escribí parte de esa página. Mi respuesta fue escrita hace 8 años, así que sí, está un poco desactualizada, pero la pregunta original indicó específicamente que su anfitrión no proporcionó una versión reciente de nginx, por lo que no tuvieron acceso a try_files. - Martin Fjordvald


Podría usar algo como esto (no probado para su 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 es básicamente una forma alternativa de escritura anidada. if Declaraciones, ya que no puedes anidar en Nginx. Ver aquí Para referencia oficial en este "hack".


5
2018-03-18 23:47





Por favor no uses if dentro de un bloque de ubicación. Pueden pasar cosas malas.

location ~* ^/images/(.+)$ {
    root /www;
    try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}

$1 se convierte en el nombre de archivo que se debe probar en la directiva try_files, que se crea para lo que usted está tratando de lograr.

Esto, O, simplemente reescribirlo sin comprobar. Si esa imagen no está allí, obtendrás un 404 de todos modos.


4
2018-03-09 21:40