Статические файлы не обслуживаются в nginx должным образом

Я запускаю приложение Django с gunicorn и nginx. Структура папок на стороне сервера выглядит следующим образом для моих статических файлов:

+-- mysite.com/
    +-- public/
        --- favicon.ico
        --- robots.txt
        +-- bookmarks/
            --- bookmarks.html
        +-- static/
            --- base.js
            --- other.js

Мой конфиг nginx довольно прост на данный момент:

server {
    server_name mysite.com

    location /static/ {
        autoindex off;
        root /home/myuser/mysite.com/public/;
    }

    location / {
        proxy_pass http://localhost:8001;
        proxy_set_header Host $host;
    }
}

Доступ к любому файлу в пределах /static/ работает отлично, но когда я пытаюсь получить доступ к файлу robots.txt, я получаю сообщение 404 - File Not Found. Добавление отдельного правила устраняет эту проблему:

location /robots.txt {
    alias /home/myuser/mysite.com/public/robots.txt;
}

Нужно ли создавать правило для каждого статического файла / папки, или есть какой-то общий способ справиться с этим? Мне бы хотелось, чтобы любой URL-адрес вида mysite.com/some-file-here.txt возвращал some-file-here.txt, предполагая, что он существует в моей папке public/ на сервере. В моем примере обращение к mysite.com/bookmarks/bookmarks.html должно возвращать этот файл, поскольку он присутствует в файловой системе на стороне сервера.

Что я упускаю?

Ваша текущая конфигурация Nginx направляет запросы по URL-пути /static/ к файлам в каталоге /home/myuser/mysite.com/public/static/, что хорошо работает для этих конкретных статических файлов. Однако для других файлов, таких как robots.txt или любой произвольный файл в каталоге public/, Nginx не знает, как их обслуживать без явных инструкций. Вот почему ваш файл robots.txt не был найден, пока вы не добавили для него специальное правило.

Попробуйте это :

server {

    server_name mysite.com;
    root /home/myuser/mysite.com/public/; # Set the root for the entire server block

    location /static/ {
        autoindex off; # Since root is already specified, static files are served directly
    }

    location / {
        try_files $uri $uri/ @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_pass http://localhost:8001;
        proxy_set_header Host $host;
    }
}
Вернуться на верх