我已经设法使用 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 中也不起作用。