Назад | Перейти на главную страницу

Nginx перезаписывает URL, только если файл существует

Мне нужно написать правило перезаписи для Nginx, чтобы, если пользователь попытается перейти на старый URL-адрес изображения:

/images/path/to/image.png

и файл не существует, попробуйте перенаправить на:

/website_images/path/to/image.png

ТОЛЬКО если изображение существует в новом URL-адресе, в противном случае продолжайте с 404. Версия Nginx на нашем хосте еще не имеет файлов try_files.

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

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

Тем не менее, вы можете захотеть исправить свой хост, чтобы обновить его или найти лучший хост.

Пожалуйста, не используйте if внутри блока локации. Могут случиться плохие вещи.

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

$1 становится именем файла в директиве try_files, которая предназначена для того, что вы пытаетесь выполнить.

Это ИЛИ просто переписать без проверки. Если этого изображения нет, вы все равно получите 404.

Вы можете использовать что-то вроде этого (не проверено для вашего конкретного случая):

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

Это в основном альтернативный способ написания вложенных if операторы, так как вы не можете вложиться в Nginx. Видеть Вот для официальной ссылки на этот "хак".