Рейтинг:0

Nginx try_files не работает с первым параметром и возвращает 404

флаг jp

Потерпите меня, это долго.

Вначале я создал сервер Nginx для обработки статических файлов для моей компании, и он отлично работал со следующим фрагментом конфигурации для обслуживания файлов:

сервер {
  # куча ssl вещей
  корень /путь/к/файлам;

  место расположения / {
    включить cors_support;
    отправить файл включен;
    sendfile_max_chunk 1м;

    try_files $uri = 404;
  }

Просто, чисто и функционально. Пока я не подумал добавить к этому серверу еще одну функцию: хранение наших сборок приложений и предоставление их нашей команде контроля качества. Поскольку файлы приложения могут быть довольно большими, я добавил еще один том хранилища только для сборок и подумал, что смогу избежать этого, просто изменив конфигурацию Nginx следующим образом (показаны только соответствующие части):

сервер {
  # в основном то же самое
  корень /новый/путь/к/сборкам;

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

  местоположение @cdn_files {
    #некоторые настройки cors и send_file
    корень /путь/к/файлам;
    try_files $uri = 404;
  }
}

Что я ожидал, согласно документации:

  • приходит запрос на файл
  • проверяет первый блок на наличие файла
  • файл найден? yes=отправляет файл no=перенаправить в указанное место
  • именованное местоположение -> файл найден? yes=отправляет файл no=страница 404

Что происходит на самом деле:

  • приходит запрос на файл
  • проверяет первый блок на наличие файла
  • файл найден? yes=отправляет файл no=страница 404

Я пробовал несколько разных попыток исправить это, в том числе несколько безумных попыток «радуйся, Мария».

Это дает тот же результат (страница 404):

# ... нерелевантный код
корень /;
место расположения / {
  # ... более нерелевантный код
  try_files /new/path/to/builds/$uri /path/to/files/$uri =404;
}

Это дает тот же результат (страница 404):

# ...
корень /новый/путь/к/сборкам;

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

местоположение @cdn_files {
  # ...
  корень /путь/к/файлам;
  try_files $uri =403; # обратите внимание, что доставленная страница имеет 404, а НЕ 403
}

Это также производит 404:

# Я удалил директиву "root" из блока сервера для этого теста

место расположения / {
  # ...
  корень /новый/путь/к/сборкам;
  try_files $uri ../realitve/path/to/files/$uri =404;
}

Несколько других замечаний:

  • Журналы ошибок показывают только 1 попытку найти файл по первому параметру try_files директива.
  • Если файл существует в первом параметре try_files директива файл доставлен
  • Я не думаю, что это относительно, но на всякий случай: ОС Ubuntu 16.04.

Редактировать:

  • Nginx версии 1.21.0
Ivan Shatsky avatar
флаг gr
Я полагаю, вы понимаете, что файл будет искаться в `root` + `uri`, то есть сначала будет искаться URI запроса `/uploads/myfile` как `/new/path/to/builds/uploads/myfile` и `/path/to/files/uploads/myfile` во-вторых. Кроме того, в вашей конфигурации нет ошибок. Единственная причина, по которой я могу предположить, заключается в том, что ваш запрос на самом деле обрабатывается каким-то другим местом, а не `location / { ... }`. Однако, чтобы быть уверенным, необходима вся конфигурация, а также фактический URI запроса.
Рейтинг:0
флаг jp

Итак, мне, наконец, удалось заставить это работать, направив мои входящие запросы на сборки через новый URL-адрес и, таким образом, в их собственный серверный блок, оставив исходный доступ к файлам, как это было до изменений, и теперь оба URL-адреса работают для извлечения файлов из их конкретных места.

Я искал, гуглил и возился несколько часов, но так и не смог исправить доступ к файлам из нескольких каталогов в одном блоке сервера, хотя, судя по документации, это должно было быть возможно.

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

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