在同一子域上沿Django应用程序[DRF API]提供静态网站?
我有一个子域:app.example.com 现在,我想在app.example.com上提供一个静态网站,它对Django应用程序进行一些基于API的查询,我想在相同的基本URL上托管它,比如:app.example.com/app/API 但我不能这样做。我的Nginx配置如下:在同一子域上沿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
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。