Назад | Перейти на главную страницу

Заставить Nginx обслуживать /static/index.html в / (корень)

Мне удалось настроить Django с Gunicorn и Nginx до такой степени, что все работает правильно - за исключением одной желаемой функции.

Я хотел бы иметь возможность обслуживать /static/index.html при доступе только к root (/) без изменение отображаемого URL-адреса в браузере. Я не уверен, что здесь использовать (переписать или псевдоним или что-то еще?) Вот мой текущий nginx.conf

upstream test_server {
   server unix:/path/to/project/project.sock fail_timeout=10s;
}

server {
   listen 80;
   server_name <IP>;

   location = /favicon.ico { access_log off; log_not_found off; }

   location = / {
      alias /path/to/project/static/;  # Does not work! See comment below
   }

   location /static/ {
      alias /path/to/project/static/;  # works!
   }

   location / {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_pass http://unix:/path/to/project/project.sock;  # communicates with Gunicorn/Django
   }
}

Комментарий сверху: кажется, что путь вперед index.html как запрос к Django, в результате чего Django жалуется «Not Found: /index.html», хотя Django даже не должен знать об этом. Imo Nginx должен просто вернуть /static/index.html сюда без участия Django.

Как я могу это исправить (все еще отображается <IP>/ в браузере, а не <IP>/static/index.html)?

server {
   # listen, server_name, etc...

   root /path/to/project;

   location = / {
       rewrite ^ /static/index.html;
   }

   location /static/ {
   }

   location / {
      # proxy ...
   }
}

Я нашел решение. Он немного отличался от того, что предложил AlexeyTen:

server {
   # listen, server_name, etc...

   location = / {
       root /path/to/project;
       rewrite ^/$ /static/index.html last;
   }

   location /static/ {
       alias /path/to/project/static/;
   }

   location / {
      # proxy ...
   }
}

root вне блоков местоположения не работали, равно как и не включили его напрямую в URL перезаписи.