Nginx: X-Accel-Redirect не работает в файлах с известным расширением MIME
Я занимаюсь разработкой веб-приложения, и заголовок X-Accel-Redirect отлично работает только в файлах без расширения. По какой-то причине, если я добавлю расширение к имени файла, X-Accel-Redirect не будет работать.
Рабочий пример:
X-Accel-Redirect: /protected_files/myfile01.z
Нерабочий пример:
X-Accel-Redirect: /protected_files/myfile01.zip
Я использую nginx 1.7.1.
Первоначально, странная часть заключается в том, что если я изменяю часть расширения (в данном случае ".zip") на что-то, что не зарегистрировано в файле mime.types, это работает нормально (очевидно, я переименовываю файл соответственно), но с указанием расширения к известному типу MIME (что-то вроде "zip", "jpg", "html") будет генерироваться ошибка "404 Not found".
ОБНОВЛЕНИЕ: Кажется, что проблема связана с этим правилом, которое я имею в файле conf:
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
По какой-то причине кажется, что nginx сначала проверяет существование файла в файловой системе, а после этого - "внутренний / псевдоним".
Любые идеи о том, как позволить nginx фильтровать все "/protected_files", поступающие из X-Accel-Redirect напрямую во "внутренний", вместо того, чтобы пытаться сначала найти другие пути?
Заранее спасибо.
1 ответ
Ошибка произошла из-за конфликта в правилах в конфигурационном файле nginx.
Итак, решение было:
location ^~ /protected_files { # ^~ needed according to the [nginx docs][1] to avoid nginx to check more locations
internal;
alias /path/to/static/files/directory;
}
#avoid processing of calls to unexisting static files by my app
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
Надеюсь, это поможет многим из вас.