fix: 添加 ProxyFix 中间件修复登录状态丢失问题

- 添加 werkzeug.middleware.proxy_fix.ProxyFix 中间件
- 配置信任反向代理的 X-Forwarded-Proto 头
- 解决 Nginx 反向代理后 Flask 无法识别 HTTPS 的问题
- 之前 SESSION_COOKIE_SECURE=True 会导致 cookie 被清除

问题根因:
1. Nginx 通过 HTTP 转发请求到 Flask
2. Flask 认为是 HTTP 请求,request.is_secure = False
3. SESSION_COOKIE_SECURE=True 导致 cookie 被立即删除

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-14 21:47:58 +08:00
parent 72e72833ab
commit 073a0cbd7e

11
app.py
View File

@@ -63,6 +63,7 @@ from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
import random
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.middleware.proxy_fix import ProxyFix
import re
import string
from datetime import datetime, timedelta, time as dt_time, date
@@ -175,6 +176,16 @@ es_client = Elasticsearch(
app = Flask(__name__)
# ============ ProxyFix 配置(信任反向代理头)============
# 重要:解决 Nginx 反向代理后 Flask 无法识别 HTTPS 的问题
# 这会导致 SESSION_COOKIE_SECURE=True 时 cookie 被清除
# x_for=1: 信任 1 层代理的 X-Forwarded-For 头(获取真实客户端 IP
# x_proto=1: 信任 1 层代理的 X-Forwarded-Proto 头(识别 HTTPS
# x_host=1: 信任 1 层代理的 X-Forwarded-Host 头(获取原始 Host
# x_prefix=1: 信任 1 层代理的 X-Forwarded-Prefix 头URL 前缀)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)
print("✅ ProxyFix 已配置Flask 将信任反向代理头X-Forwarded-Proto 等)")
# ============ Redis 连接配置(支持环境变量覆盖) ============
_REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
_REDIS_PORT = int(os.environ.get('REDIS_PORT', 6379))