fix: resolve stuck detecting state for panel stats on subpath deploy
Always inject panel_base from PANEL_PATH for static/API URLs and set SCRIPT_NAME in middleware so /api/stats works behind nginx subpaths. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+16
-6
@@ -52,18 +52,20 @@ if _panel_path:
|
||||
app.config["SESSION_COOKIE_PATH"] = f"/{_panel_path}/"
|
||||
app.config["PREFERRED_URL_SCHEME"] = "http"
|
||||
app.wsgi_app = ProxyFix(
|
||||
app.wsgi_app, x_for=1, x_proto=1, x_host=0, x_prefix=1
|
||||
app.wsgi_app, x_for=1, x_proto=1, x_host=0, x_prefix=0
|
||||
)
|
||||
|
||||
|
||||
class _PanelHostMiddleware:
|
||||
"""CDN/反代未传 Host 时,避免重定向到 http://[No Host]/...。"""
|
||||
class _PanelPrefixMiddleware:
|
||||
"""始终用 PANEL_PATH 设置 SCRIPT_NAME,不依赖反代头是否完整。"""
|
||||
|
||||
def __init__(self, app, domain: str):
|
||||
def __init__(self, app, prefix: str, domain: str = ""):
|
||||
self.app = app
|
||||
self.script_name = f"/{prefix.strip('/')}"
|
||||
self.domain = domain
|
||||
|
||||
def __call__(self, environ, start_response):
|
||||
environ["SCRIPT_NAME"] = self.script_name
|
||||
if self.domain and not environ.get("HTTP_HOST"):
|
||||
environ["HTTP_HOST"] = self.domain
|
||||
if not environ.get("HTTP_X_FORWARDED_PROTO"):
|
||||
@@ -71,8 +73,16 @@ class _PanelHostMiddleware:
|
||||
return self.app(environ, start_response)
|
||||
|
||||
|
||||
if _panel_domain:
|
||||
app.wsgi_app = _PanelHostMiddleware(app.wsgi_app, _panel_domain)
|
||||
if _panel_path:
|
||||
app.wsgi_app = _PanelPrefixMiddleware(
|
||||
app.wsgi_app, _panel_path, _panel_domain
|
||||
)
|
||||
|
||||
|
||||
@app.context_processor
|
||||
def inject_panel_base() -> dict[str, str]:
|
||||
base = f"/{_panel_path}" if _panel_path else ""
|
||||
return {"panel_base": base}
|
||||
|
||||
|
||||
def login_required(view):
|
||||
|
||||
Reference in New Issue
Block a user