Nginx

從 Nginx 反向代理的 Django ASGI 伺服器重定向到錯誤的子目錄

  • March 9, 2021

我正在嘗試將 Etebase 安裝在我的 Nginx 網路伺服器的子目錄中。(我還在這個伺服器上的一個單獨的子目錄中執行一個 Pi-hole 儀表板。) Etebase 是一個使用 ASGI 的 Django 應用程序。我使用 Uvicorn 作為上游 ASGI 網路伺服器。

我已經成功地反向代理了 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

看起來該路線被視為相對路徑而不是絕對路徑。這將解釋附加而不是替換的路徑。

原因可能是您的--root-path論點中缺少前導斜杠。

試試這個:

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

引用自:https://serverfault.com/questions/1056374