Рейтинг:2

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

флаг sd

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

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

Пример

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

Пример в .htaccess

RewriteCond %{REQUEST_FILENAME} -f [ИЛИ]
RewriteCond %{REQUEST_FILENAME} -d
Правило перезаписи (.*) - [L]
Правило перезаписи (.*) https://example2.com/backup/$1 [L]

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

  1. Поиск существующих решений, но я не нашел рабочего решения.
  2. Попробуйте преобразовать конфигурацию apache в конфигурацию Nginx через конвертеры, но не работает.

Некоторые пытались настроить, но не работали.

    расположение ~ /данные/.* {
        если (-e $request_filename){
            переписать ^ https://www.example2.com/backup/$1 в последний раз;
        } 
    }


    расположение ~ /данные/.* {
        если (-e $request_filename){
            переписать ^ https://www.example2.com/backup/$1 навсегда;
        } 
    }


    расположение ~ /данные/.* {
        try_files $uri https://www.example2.com/backup/$uri;
    }
флаг kz
В вашем примере вы перенаправляете с `example.com/data/1.jpg` на `example2.com/backup/1.jpg` - это преднамеренно? Или это должен быть `example2.com/backup/data/1.jpg` (что и предполагает ваш код и текущий ответ)?
Shubham Panchal avatar
флаг sd
Да, example2.com/backup/1.jpg создан намеренно.
Рейтинг:1
флаг us
Rob

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

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

место расположения / {
    try_files $uri @externalbackup;
}

расположение @externalbackup {
     вернуть 301 https://www.example2.com/backup$request_uri ;
}

Приведенный выше код не проверен.

флаг kz
Я думаю, что этот тип перенаправления должен быть 302 (временным), если есть намерение, что первоначально запрошенный файл может существовать в будущем.
Shubham Panchal avatar
флаг sd
Спасибо @Rob за ваш ответ. Я пробовал это, и перенаправление работает, но имя файла не работает в перенаправленном URL-адресе. Это как: https://www.example2.com/backup Но следует: https://www.example2.com/backup/file_name_here
Рейтинг:1
флаг sd

Я получил решение после изменения ответа @Rob.

установить $v_filename nf;

расположение ~ ^/данные/(.*)$ {
    try_files $uri @externalbackup;
    установить $v_filename $1;
}

расположение @externalbackup {
     вернуть 301 https://www.example2.com/backup/$v_filename ;
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.