Перенаправить на другой сервер и домен, если файл не найден

Перенаправить на другой сервер и домен, если файл не найден

Я перешел с Apache на Nginx, поэтому хочу настроить все правила в Nginx.

Цель:Перенаправить URL-адрес на другой домен с тем же именем файла, если этот файл не найден на запрошенном сервере.

Пример

Если пользователь открываетhttps://www.example.com/data/1.jpgтогда мой сервер попытается найти "1.jpg" в каталоге "data". Если этот файл не найден, перенаправьте пользователя на URL резервного сервера, напримерhttps://www.example2.com/backup/1.jpg

Пример в .htaccess

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

Что я пробовал

  1. Искал существующие решения, но не нашел ни одного работающего.
  2. Попробуйте преобразовать конфигурацию Apache в конфигурацию Nginx с помощью конвертеров, но это не сработает.

Некоторые пробовали конфигурацию, но она не работает.

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

решение1

Я нашел решение после изменения ответа @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 ;
}

решение2

В nginx вы бы использовалиtry_files директива, которая обслуживает содержимое локального файла, если он существует в одном (или нескольких) локальных каталогах. Если файл не найден, выполняется внутреннее перенаправление на uri, указанный в последнем параметре.

Поскольку это не может перенаправить наружу, вам нужно немного хитрости и двухуровневый подход. В параметрах try_files вы используете именованное местоположение для этого внутреннего перенаправления, и из этого именованного местоположения вы создаете внешнее перенаправление.

location / {
    try_files  $uri  @externalbackup;
}

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

Приведенный выше код не тестировался.

Связанный контент