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;
}

Надеюсь, это поможет многим из вас.

Другие вопросы по тегам