Flask重定向命令转到http而不是https

3

我有一个 Flask 应用程序在 Nginx 服务器后面。Nginx 处理 SSL 终止和重定向到 https,所有 http 请求都被重定向。

在 Flask 中,我认为不需要知道任何这些内容,我有以下代码:

@bp.route('/', methods=['GET', 'POST'])
def index_root():
    """Assign a session tag.

    """
    return redirect(url_for('main.index', tag=make_new_tag()))

@bp.route('/D/<tag>/accueil', methods=['GET', 'POST'])
def index(tag):
    return render_template('index.html', title='', tag=tag)

现在我有一个问题:当有人请求http://example.com/时,nginx会将其301重定向到https://www.example.com/,这是正确的。然后flask将其302重定向到http://www.example.com/D/123/accueil,这不太好,因为nginx只会将其301重定向到https://www.example.com/D/123/accueil(这是好的,但我更喜欢跳过这个额外的重定向)。
这是某个配置问题吗?
请注意,在开发中,flask确实不考虑https是很重要的。事实上,flask根本不需要知道https的任何信息,这就是为什么我觉得有点费解的原因。
谢谢任何指导。

1
这个反向代理答案由 @aldel 提供,可能会有所帮助。 - undefined
2个回答

3
目前实现这一功能的方法似乎是将x_proto=1作为参数传递给Werkzeug的ProxyFix中间件:
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)

app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1 ,x_proto=1)

请务必按照文档正确设置x_for,该变量应设置为代理服务器的数量,并且出于安全原因,必须正确设置,否则Flask可能会将某些由互联网用户设置的头文件视为来自反向代理的头文件。如果没有代理,危险的做法是将其设置为1。

然后在nginx中,在proxy_pass之前的位置块中,请确保正确设置X-Forwarded-Proto标头。

 location  / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://localhost:9999/;
  }

我没有在nginx上测试过这个,但我能够直接对开发服务器和gunicorn进行测试,通过在curl中特别设置该标头:

curl -is http://localhost:5000/  -H 'X-Forwarded-Proto: https'

这将返回:
HTTP/1.0 302 FOUND
Location: https://localhost:5000/test_str/accueil`

因此,它似乎会影响url_for,而不需要修改代码中的每个url_for()调用,这与@PGHE链接的被接受的答案情况不同。

1
我已经在反向代理方面(Nginx)通过使用 X-Forwarded-HTTPS 而不是 X-Forwarded-Proto 解决了这个问题。
location  / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header   X-Forwarded-HTTPS    on;

    proxy_pass http://localhost:9999/;
  }

试过了。但是不起作用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接