Статические файлы не обслуживаются в 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;
}
}