Flask 通过 Nginx 代理后获取 HTTPS 正确 URL 的解决方案

文章目录

在使用 Flask 和 Nginx 搭建应用时,可能会遇到 wsgi.url_scheme 返回 http 而非 https 的问题。这是因为 Nginx 在处理 HTTPS 请求时,实际上是将请求通过 HTTP 协议转发给 Flask 后端,导致 Flask 认为请求是通过 HTTP 进行的。这种情况不仅影响到 URL 的生成,还可能对应用的安全性造成隐患。

问题描述

当用户发起 HTTPS 请求时,Nginx 先与用户建立 SSL 连接并完成握手,随后以 HTTP 协议将请求转发给 Gunicorn。由于这个透明的代理过程,Gunicorn 只处理 HTTP 请求,因而 Flask 中的请求对象仍然显示 http 作为协议。这直接导致了生成的链接使用了不安全的 HTTP 协议。

解决方案

要解决这个问题,可以使用 Flask 的 ProxyFix。通过在 Flask 应用中应用此中间件,可以正确识别请求的原始协议。以下是具体的实现步骤:

Flask 使用 ProxyFix 的示例代码:

from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)

Nginx 配置示例:

location / {
    proxy_pass http://your_upstream/;  # 确保使用 http,而不是 https
    proxy_set_header   Host             $host;
    proxy_set_header   X-Forwarded-Proto  $scheme;
}

FAQ

1. 什么是 ProxyFix ProxyFix 是 Flask 的一个中间件,用于处理代理服务器转发请求时的 HTTP 头信息,从而确保 Flask 能正确识别原始请求的协议和地址。

2. 如何确认 Nginx 的配置是否正确? 可以通过在浏览器中访问 HTTPS 版本的 URL,然后查看 Flask 应用的日志,确认 wsgi.url_scheme 是否为 https

3. 使用 ProxyFix 有什么注意事项? 在使用 ProxyFix 时,需要确保 Nginx 的 X-Forwarded-ProtoHost 头部设置正确,以便 Flask 能够准确解析请求信息。

结论

通过使用 Nginx 和 Flask 的组合,正确处理 HTTPS 请求是实现安全应用的重要一步。确保配置 Nginx 和 Flask 的 ProxyFix 是确保 wsgi.url_scheme 返回正确值的关键。


也可以看看