Мне нужно написать правило перезаписи для 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. Видеть Вот для официальной ссылки на этот "хак".