让 Nginx 在 / (根目录)上提供 /static/index.html 服务

让 Nginx 在 / (根目录)上提供 /static/index.html 服务

我已经设法使用 Gunicorn 和 Nginx 设置了 Django,到目前为止,一切都正常运行 - 除了一个想要的功能。

我希望仅在访问根目录时才能够提供 /static/index.html ( /)没有更改浏览器中显示的 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 抱怨“未找到:/index.html”,尽管 Django 甚至不应该知道这一点。在我看来,Nginx 应该在这里简单地返回 /static/index.html,而不涉及 Django。

我该如何纠正这个问题(仍然显示<IP>/在浏览器中而不显示<IP>/static/index.html)?

答案1

server {
   # listen, server_name, etc...

   root /path/to/project;

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

   location /static/ {
   }

   location / {
      # proxy ...
   }
}

答案2

我找到了解决方案。它与 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 中也不起作用。

相关内容