告知 Flask 它运行在代理之后¶
在使用反向代理,或托管在许多 Python 平台上时, 代理会拦截所有外部请求,并将其转发给本地的 WSGI 服务器。
从 WSGI 服务器和 Flask 应用的角度来看, 请求是从 HTTP 服务器发往本地地址的,而不是从远程地址发往外部服务器地址。
为了解决这个问题,HTTP 服务器应设置 X-Forwarded- 开头的请求头,以将真实的客户端信息传递给应用。 应用可以通过 Werkzeug 提供的 X-Forwarded-For Proxy Fix 中间件进行包装, 以信任并使用这些请求头中的真实信息。
只有在应用确实部署在代理后方时,才应使用此中间件,并且必须正确配置代理的数量(即前方代理链的层数)。 并非所有代理都会设置所有相关请求头。 由于传入请求头可能被伪造,因此必须指定由多少个代理设置了每个请求头, 以便中间件知道哪些信息是可信的。
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(
app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1
)
请记住,只有在你处于代理之后时才使用该中间件, 并且要为设置了每个请求头的那些代理设置正确的数量值。如果配置错误,可能会带来安全风险。