从 Nginx 反向代理的 Django ASGI 服务器重定向到错误的子目录

从 Nginx 反向代理的 Django ASGI 服务器重定向到错误的子目录

我正在尝试将 Etebase 安装在我的 Nginx Web 服务器的子目录中。(我还在这个服务器上的单独子目录中运行 Pi-hole 仪表板。)Etebase 是一个使用 ASGI 的 Django 应用程序。我使用 Uvicorn 作为上游 ASGI Web 服务器。

我已成功反向代理 Etebase 服务器dan9er.internal/etesync。直接转到 dan9er.internal/etesync显示“成功了!”页面。

但是,重定向未得到正确处理。dan9er.internal/etesync/admin/重定向到dan9er.internal/etesync/admin/etesync/admin/login/?next=etesync/admin/它是添加目录,而不是/etesync/像我在其他问题中看到的那样删除目录。(直接前往dan9er.internal/etesync/admin/login/就可以了。)

我该如何修复这个问题dan9er.internal/etesync/admin/login/?next=etesync/admin/?我需要在 Uvicorn、Etebase 或 Nginx 中修改某些内容吗?

Nginx 配置:

upstream etebase {
    server unix:///tmp/etebase_server.sock;
}

# ...

location /etesync/ {
    proxy_pass http://etebase/;
    proxy_redirect off;

    # proxy_set_header stuff...
}

# ...

Etebase 配置(Django):

[global]
secret_file = secret.txt
debug = false
static_root = /home/eteserver/etebase/static/
media_root = /home/eteserver/etebase/media/

[allowed_hosts]
allowed_host1 = dan9er.internal

[database]
engine = django.db.backends.sqlite3
name = db.sqlite3

启动命令:

/home/eteserver/etebase/.venv/bin/uvicorn etebase_server.asgi:application --uds /tmp/etebase_server.sock --root-path etesync

摘自 Nginx 日志(前端服务器,代理字符串已删除):

192.168.0.204 - - [08/Mar/2021:20:07:06 -0500] "GET /etesync/admin/ HTTP/1.1" 302 0 "-"
192.168.0.204 - - [08/Mar/2021:20:07:06 -0500] "GET /etesync/admin/etesync/admin/login/?next=etesync/admin/ HTTP/1.1" 404 159 "-"

摘自 Uvicorn 日志(上游服务器):

Mar 08 20:07:06 dan9er-pi3 uvicorn[23360]: INFO:      - "GET etesync/admin/ HTTP/1.1" 302 Found
Mar 08 20:07:06 dan9er-pi3 uvicorn[23360]: INFO:      - "GET etesync/admin/etesync/admin/login/?next=etesync/admin/ HTTP/1.1" 404 Not Found

答案1

看起来该路线被视为相对路径而非绝对路径。这可以解释路径被附加而不是被替换的原因。

原因可能是你的--root-path论点中缺少一个前导斜杠。

尝试一下:

/home/eteserver/etebase/.venv/bin/uvicorn etebase_server.asgi:application --uds /tmp/etebase_server.sock --root-path /etesync

相关内容