Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一子域上沿Django应用程序[DRF API]提供静态网站?_Django_Nginx_Webserver - Fatal编程技术网

在同一子域上沿Django应用程序[DRF API]提供静态网站?

在同一子域上沿Django应用程序[DRF API]提供静态网站?,django,nginx,webserver,Django,Nginx,Webserver,我有一个子域:app.example.com 现在,我想在app.example.com上提供一个静态网站,它对Django应用程序进行一些基于API的查询,我想在相同的基本URL上托管它,比如:app.example.com/app/API 但我不能这样做。我的Nginx配置如下: server { root /home/ubuntu/dist/; index index.html index.htm index.nginx-debian.html; serve

我有一个子域:app.example.com

现在,我想在app.example.com上提供一个静态网站,它对Django应用程序进行一些基于API的查询,我想在相同的基本URL上托管它,比如:app.example.com/app/API

但我不能这样做。我的Nginx配置如下:

server {


    root /home/ubuntu/dist/;

    index index.html index.htm index.nginx-debian.html;

    server_name app.example.com;

        location / {
        alias /home/ubuntu/dist/ ;
        try_files $uri /$uri index.html last;
                 }

    location /admind {
        alias /home/ubuntu/admind/dist/ ;
        try_files $uri /$uri/ index.html last;

    }
        location /app/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://gunicorn;
    }


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}



# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#   listen 80;
#   listen [::]:80;
#
#   server_name example.com;
#
#   root /var/www/example.com;
#   index index.html;
#
#   location / {
#       try_files $uri $uri/ =404;
#   }
#}

server {
    if ($host = app.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    listen [::]:80 default_server;

    server_name app.example.com;
    return 404; # managed by Certbot


}
每当我实现以下配置时,app.example.com会按预期打开,但Django admin的Django app url app.example.com/app/api或为此/app/admin/不会打开并抛出404。
TIA

您需要添加一个头,告诉Django您正在从一个子路径提供服务

location /app/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header SCRIPT_NAME app;
    proxy_redirect off;
    proxy_pass http://gunicorn;
}

您只需在所有核心
URL\u模式
中添加一个
BASE\u URL
,类似于

settings.py

BASE\u URl='app/'
url.py

来自django.conf导入设置的

从django.url导入路径
从。视图导入*
URL模式=[
路径(“%sadmin/%settings.BASE\u URL,AdminView,name='admin'),
路径(“%sapi/%settings.BASE\u URL,MyAPIView,name=“myapi”),
]

这样一来,你所有的URL都已经以app/开始,所以即使你反向代理根
app.example.com
它仍然会在
app/

上运行,另一种方法是将
FORCE\u SCRIPT\u NAME='/app'
放在你的settings.py中。现在,它将我重定向到/app/app/admin,这再次表明404未找到。谢谢Ayush。这似乎奏效了。:)我已经调整了我的url.py。