如何使用Django在Nginx中将子目录作为根服务?

时间:2018-12-15 00:40:19

标签: python django nginx url-rewriting

当用户访问www.website.com时,我希望像访问过www.website.com/frontend/一样来存储内容。但是,我想屏蔽URL的/ frontend /部分,以便用户看不到它。能做到吗?

我的重写规则是什么样的?

已解决:

location = / {
    rewrite ^/$ /frontend/ last;
}

我的问题是

location = / {} #Matches the path project.example.com only (mind there is a =)
location / {} #Matches every path (mind: there is no =)

3 个答案:

答案 0 :(得分:0)

已解决:

location = / {
    rewrite ^/$ /frontend/ last;
}

我的问题是

location = / {} #Matches the path project.example.com only (mind there is a =)
location / {} #Matches every path (mind: there is no =)

答案 1 :(得分:0)

您不需要为此重写规则。只需使用

location / {
    proxy_pass http://<your_backend>/frontend/;
}

答案 2 :(得分:0)

我认为使用rewrite并不是完美的解决方案(顺便说一句,我认为它不能涵盖您问题的所有方面并可能导致新问题)

解决方法如下:

nginx配置应如下所示:

upstream django {
    server unix://tmp/gunicorn.sock;  //
}

server {
    listen 80;
    server_name <your_app_domain_here>;
    location /frontend {
        include uwsgi_params;
        proxy_pass http://django/;
    }
}

,或者如果您不使用sock文件,则可以使用http方法。例如,如果您在本地主机上使用端口8000运行django,则将其更改为:

proxy_pass http://localhost:8000/;

但是请记住,您应该将其添加到Django settings.py中。除非它根本不起作用:

USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = "/frontend"

通过这种方法,您正在django中更改基本URL。因此所有django网址都应以fronted标签开头。现在,nginx可以完美地充当您网站的反向代理了:)