生产环境建议在反向代理层(如 Nginx)配置 HTTPS 强制跳转,而非在 Flask 应用代码中处理,这样能降低应用负载并确保统一的安全策略。
先说结论:Flask 生产环境强制 HTTPS 跳转应由 Web 服务器(Nginx/Apache)或负载均衡器完成,Flask 应用侧仅需配置安全 Cookie 和信任代理头。
- 适合:部署在 Nginx、Apache 或云负载均衡器后的 Flask 应用
- 优先做:在反向代理配置 301 重定向并启用 HSTS 头
- 再验证:使用 curl 命令检查响应头状态码和 Security 策略
命令速用版
若使用 Nginx 作为反向代理,可在 server 配置块中添加以下规则实现 HTTP 到 HTTPS 的强制跳转:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
该配置监听 80 端口,将所有请求永久重定向到对应的 HTTPS 地址,无需修改 Flask 代码。
为什么会这样
HTTPS 解密和跳转逻辑放在反向代理层能显著减轻 Flask 应用的处理压力。Flask 作为 WSGI 应用,设计初衷是处理业务逻辑,而非管理 TLS 握手或流量调度。
在代理层统一处理 HTTPS 跳转,可以避免每个 Flask 实例都维护证书,同时也方便统一配置 HSTS(HTTP Strict Transport Security)等安全响应头,确保客户端浏览器强制使用加密连接。
分步处理
第一步:准备 SSL 证书
通过 Let's Encrypt 或云服务商申请域名证书,确保证书文件(.crt)和私钥文件(.key)已放置在服务器安全目录。
第二步:配置 Nginx 跳转
在 Nginx 配置文件中,保留 443 端口的 HTTPS 配置,新增 80 端口配置块用于跳转。确保 return 301 指令正确指向域名,避免写死 IP 地址。
第三步:配置 Flask 安全选项
在 Flask 应用配置中,设置 SESSION_COOKIE_SECURE = True 确保 Cookie 仅通过 HTTPS 传输。若 Flask 位于 Nginx 后,需启用 ProxyFix 中间件以正确识别协议头。
第四步:启用 HSTS 头
在 Nginx 的 HTTPS server 块中添加 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;,通知浏览器在未来一年内强制使用 HTTPS。
怎么验证是否生效
使用 curl 命令检查 HTTP 请求是否被重定向且状态码为 301:
curl -I http://example.com
观察返回头中 Location 字段是否以 https:// 开头,且状态码显示 301 Moved Permanently。同时检查 HTTPS 请求响应头中是否包含 Strict-Transport-Security 字段。
在浏览器中访问 HTTP 地址,确认地址栏自动变为 HTTPS 且锁形图标显示正常,无混合内容警告。
常见坑
重定向循环:若 Flask 内部也写了跳转逻辑,而 Nginx 也配置了跳转,可能导致无限重定向。确保跳转逻辑只保留在 Nginx 层。
协议识别错误:Flask 生成 URL 时可能仍使用 http 方案。需在 Flask 配置中设置 PREFERRED_URL_SCHEME = 'https' 或依赖 X-Forwarded-Proto 头。
Cookie 丢失:若未配置 SESSION_COOKIE_SECURE = True,浏览器可能拒绝在非 HTTPS 环境下发送 Cookie,导致登录状态失效。
常见问题
Flask 代码里能用 before_request 做跳转吗?
不建议在生产环境这样做。应用层跳转会增加每次请求的 Python 执行开销,且无法在 TLS 握手前生效,反向代理层处理更高效。
HSTS 头配置后有什么风险?
一旦浏览器缓存了 HSTS 策略,在证书过期或配置错误时用户将无法访问网站。建议初期设置较短的 max-age 值,测试无误后再延长。
本地开发环境需要配置 HTTPS 跳转吗?
不需要。本地开发通常使用 http://127.0.0.1:5000,强制 HTTPS 会增加自签名证书配置成本,仅在测试生产环境部署时才需模拟。
参考来源
- Flask Official Documentation, Deploying to Production, https://flask.palletsprojects.com/en/latest/deploying/
- Nginx Documentation, Configuring HTTPS servers, https://nginx.org/en/docs/http/configuring_https_servers.html
- OWASP, HTTP Strict Transport Security, https://owasp.org/www-project-secure-headers/