Потерпите меня, это долго.
Вначале я создал сервер 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.
Редактировать: