相关疑难解决方法(0)

使Flask的url_for在AWS负载均衡器中使用"https"方案,而不会弄乱SSLify

我最近在我的webapp上添加了SSL证书.它部署在Amazon Web Services上使用负载均衡器.负载平衡器用作反向代理,处理外部HTTPS并发送内部HTTP.因此,尽管是安全连接,但我的Flask应用程序的所有流量都是HTTP,而不是HTTPS.

由于该网站在HTTPS迁移之前已经在线,因此我使用SSLify发送301 PERMANENT REDIRECTS到HTTP连接.尽管所有连接都是HTTP,但它仍然有效,因为反向代理X-Forwarded-Proto使用原始协议设置请求标头.

问题

url_for不关心X-Forwarded-Proto.my_flask_app.config['PREFERRED_URL_SCHEME']当方案不可用时,它将使用,但在请求期间,方案可用.与反向代理连接的HTTP方案.

因此,当有人连接时https://example.com,它会连接到负载均衡器,然后使用负载均衡器连接到Flask http://example.com.Flask看到http并假设该方案是HTTP,而不是原来的HTTPS.

这在大多数url_for模板中使用都不是问题,但任何url_for使用的_external=True都将使用http而不是https.就个人而言,我使用_external=True,rel=canonical因为我听说它是​​推荐的做法.除此之外,using Flask.redirect将使用非_external url前置http://example.com,因为重定向头必须是完全限定的URL.

例如,如果您在表单帖子上重定向,则会发生这种情况.

  1. 客户帖子 https://example.com/form
  2. 服务器发布303 SEE OTHERhttp://example.com/form-posted
  3. 然后SSLify发出一个301 PERMANENT REDIRECThttps://example.com/form-posted

由于SSLify,每次重定向都会成为2次重定向.

试图解决方案

添加PREFERRED_URL_SCHEME配置

/sf/answers/1864581631/

my_flask_app.config['PREFERRED_URL_SCHEME'] = 'https'
Run Code Online (Sandbox Code Playgroud)

不起作用,因为在请求期间存在方案,而是使用该方案.见https://github.com/mitsuhiko/flask/issues/1129#issuecomment-51759359

包装中间件以模拟HTTPS

/sf/answers/1977330421/

def _force_https(app):
    def wrapper(environ, start_response):
        environ['wsgi.url_scheme'] = 'https'
        return app(environ, start_response)
    return …
Run Code Online (Sandbox Code Playgroud)

python https amazon-web-services flask

20
推荐指数
2
解决办法
4996
查看次数

X-Forwarded-Proto和Flask

我有这个问题和答案中描述的完全相同的问题.这个问题的答案是一个很好的解决方法,但我不明白根本问题.在负载均衡器处终止SSL并在负载均衡器和Web/app服务器之间使用HTTP非常常见.什么片段不尊重X-Forwarded-Proto?是werkzeug吗?烧瓶?uwsgi?

在我的情况下,我正在使用AWS ELB(设置X-Forwarded-Proto)=> Nginx(它沿着X-Forwarded-Proto转发到uwsgi).但是在python应用程序中,我必须按照上面引用的问题中描述的Flask Request子类.

由于这是一种常见的部署方案,似乎应该有更好的解决方案.我错过了什么?

python nginx werkzeug flask uwsgi

18
推荐指数
1
解决办法
6083
查看次数

Flask 正在生产中,带有 Caddy 和 Waitress url_for 重定向到本地主机

我有一个在 Windows EC2 实例上运行的 Flask 服务器。

我需要使用https协议,所以我的设置如下:

  • 我有一个 Caddy 服务器
  • 我使用 Waitress 来运行我的 Flask 应用程序

这是我的 Caddy 配置:

example.com:443{
    proxy / 127.0.0.1:8080
    tls me@example.com
}
Run Code Online (Sandbox Code Playgroud)

一切工作正常,除了在我的application.py文件中,当我这样做时:

return redirect(url_for('test', filename=filename))
Run Code Online (Sandbox Code Playgroud)

我的网络浏览器重定向我:

结果与_external=True

但是在模板页面上,例如使用https://example.com/test2呈现render_template( "test2.html"),如果我有链接,<a href="{{ url_for('index') }}" />则生成的 HTML 很好: https: //example.com/

现在我已经在 application.py 中硬编码了我的网址,但这不是我想要保留它的方式......

python wsgi flask waitress caddy

4
推荐指数
1
解决办法
3942
查看次数

标签 统计

flask ×3

python ×3

amazon-web-services ×1

caddy ×1

https ×1

nginx ×1

uwsgi ×1

waitress ×1

werkzeug ×1

wsgi ×1