nginx: Как обрабатывать 404 напрямую в обратном прокси только для некоторых имен файлов (*.txt)?

Это можно сделать с помощью редактора "sed" в стиле POSIX

sed -e '
    :a
       $q;N;y/\n/,/
       s/,die$//;t
    ba
' input_file

Способ:

  • Настройте цикл и добавьте следующую строку в пространство шаблона.
    • N команда
  • Измените новую строку на запятую, а затем попытайтесь удалить ",die"
    • y///s/// команды
  • В случае успеха, все готово, и никакой дальнейшей обработки для этого не требуется.
    • t команда без метки
  • В противном случае вернитесь за добавкой и, на всякий случай, мы спасаемся.
      Команды
    • b и q .

Мы также можем использовать для этого Perl:

perl -lne '
    push @A, $_ unless /^die$/;
    print join ",", splice @A if /^die$/ || eof;
' input_file

Где мы накапливаем строки в массиве, пока не увидим строку "die". В этот момент мы соединяем содержимое массива с помощью запятой (и очищаем массив ).

Мы также можем проглотить файл, а затем вызвать Perl для получения результатов:

perl -lF'/^die\n/m' -0777nae 'print join ",", split /\n/ for @F' input_file
  • -F '/^die\n/m' разделит файл, выделенный в виде строки, на кубике регулярного выражения BOL, за которым следует новая строка.
  • -0 777 включит чавканье.-n отключит автоматическую печать строк, а-a разделит выделенные строки (в нашем случае только на одну строку )на основе значения-F .
1
02.04.2020, 22:30
1 ответ
location /texts/ {
    proxy_set_header...;
    proxy_pass...;

    location ~ \.txt$ {
        root /path/to/root;
        try_files $uri /texts/default.txt;
        proxy_pass...;
    }
}
location = /texts/default.txt {
    root /path/to/root;
}

Обратите внимание на правильное регулярное выражение для оператора location. Операторы proxy_set_headerбудут унаследованы, но оператор proxy_passнеобходимо повторить во вложенном location.

Оператор try_filesпроверит существование файла и изменит его URI, если он не существует.

Файл по умолчанию имеет выделенный location, чтобы файл можно было обслуживать как статический файл из правильного корня.

Путь к файлу создается путем объединения значения rootс URI, поэтому файл /texts/default.txtнаходится по адресу /path/to/root/texts/default.txt.

0
28.04.2021, 23:18

Теги

Похожие вопросы